[prev in list] [next in list] [prev in thread] [next in thread] 

List:       helix-datatype-dev
Subject:    Re: [datatype-dev] CR: GetPacket call re-entrancy failure in
From:       Eric Hyche <ehyche () real ! com>
Date:       2010-01-26 16:35:03
Message-ID: 04CB7997-C5A9-428E-84CA-C8725CE1B65D () real ! com
[Download RAW message or body]

Looks good.

On Jan 26, 2010, at 11:16 AM, <rajesh.rathinasamy@nokia.com> \
<rajesh.rathinasamy@nokia.com> wrote:

> 
> 
> 
> "Nokia submits this code under the terms of a commercial contribution agreement \
> with RealNetworks, and I am authorized to contribute this code under said \
> agreement." 
> Modified by:  rajesh.rathinasamy@nokia.com
> 
> Reviewed by:
> 
> Date: 25-jan-2010
> 
> Project:  SymbianMmf
> 
> Error Id:  DALM-7ZEU4L
> 
> Synopsis: GetPacket call re-entrancy failure in fileformats
> 
> Overview: 
> Recent change in file source for async I/O is to call GetPacket within PacketReady \
> callback. Some fileformats does not handle re-entrancy. 
> AVi fileformat ended up in calling ReadHeader on RIFF twice consequtively leading \
> to wrong section of data being interpreted as chunk header. This resulted in huge \
> file seek offset. Added a state in AVIState which is set and reset during \
> PacketReady callback and avoided the ScanState when in PacketReady sent state. 
> XPSFileformat had the issue of losing the getpacket outstanding flag value. Now the \
> flag is reset before passing the packet ready call to filesource. 
> Following Fileformats were tested with this changes:
> 3GP / Mp4, rm, asf, mp3, xps, mkv
> 
> Also tested thumbnail for avi, 3gp, wmv and rm.
> 
> 
> Files removed: None
> 
> Files added:  None
> 
> Files modified: 
> datatype/avi/fileformat/aviffpln.cpp
> datatype/avi/fileformat/pub/aviffpln.h
> datatype/xps/fileformat/CXPSFileformat.cpp
> 
> 
> Image size and heap use impact:  None
> 
> Module release testing (STIF):  PASSED. Tested on 5.0 as STIF is crashing on 9.2
> 
> Test case(s) added:  No
> 
> Memory leak check performed:  No. Unable to execute due to existing leaks.
> 
> Platforms and profiles build verified: helix-client-s60-50-mmf-mdf-dsp, \
> helix-client-s60-52-mmf-mdf-dsp 
> Platforms and profiles functionality verified:  armv5, winscw
> 
> Branch:  210CayS, HEAD, 420Brizo
> 
> Index: aviffpln.cpp
> ===================================================================
> RCS file: /cvsroot/datatype/avi/fileformat/aviffpln.cpp,v
> retrieving revision 1.5.6.4
> diff -w -u -b -r1.5.6.4 aviffpln.cpp
> --- aviffpln.cpp        5 Jan 2010 17:41:09 -0000       1.5.6.4
> +++ aviffpln.cpp        26 Jan 2010 01:05:33 -0000
> @@ -691,7 +691,11 @@
> m_pFFResponse->StreamDone(unStreamNumber);
> }
> 
> +    // Re-entrancy Check
> +    if(m_state != AS_SendingPacketReady)
> +    {
> ScanState();
> +    }
> 
> return HXR_OK;
> }
> @@ -1539,7 +1543,7 @@
> }
> else
> {
> -                               m_pFFResponse->PacketReady(pnr, NULL);
> +                               SendPacketReady(pnr, NULL);
> }
> }
> break;
> @@ -1742,7 +1746,7 @@
> 
> HXLOGL4(HXLOG_AVIX,"CAVIFileFormat[%p]::ScanState\tPacketReady, stream: \
> %lu\ttimestamp: %lu", this, pPending Packet->GetStreamNumber(), \
> pPendingPacket->GetTime()); // Warning: core call
> -                m_pFFResponse->PacketReady(HXR_OK, pPendingPacket);
> +                SendPacketReady(HXR_OK, pPendingPacket);
> HX_RELEASE(pPendingPacket);
> 
> // Reentrancy ch eck; if we're closed, return:
> @@ -2086,3 +2090,29 @@
> {
> return ((char) ulChunkId - '0')*10 + ((char) (ulChunkId >> 8) - '0');
> }
> +
> +void CAVIFileFormat::SendPacketReady(HX_RESULT rv, IHXPacket* pPacket)
> +{
> +
> +  if(m_pFFResponse != NULL)
> +  {
> +    // Store current state
> +    AVIState PrevState = m_state;
> +    m_state = AS_SendingPacketReady;
> +
> +    m_pFFResponse->PacketReady(rv, pPacket);
> +
> +    // Check & restore if the state is still the same and not changed because of
> +    // other re-entrant calls. Eg. AS_Closed.
> +    if(m_state == AS_SendingPacketReady)
> +    {
> +
> +      m_state = PrevState;
> +    }
> +    else
> +    {
> +      HXLOGL1(HXLOG_AVIX,"CAVIFileFormat[%p]::SendPacketReady() WARNING \
> PrevState:%d CurrState:%d", this, PrevState, m_state );
> +    }
> +  } // End of if(m_pFFResponse != NULL)
> +
> +}
> cvs diff: Diffing platform
> cvs diff: Diffing platform/mac
> cvs diff: Diffing platform/win
> cvs diff: Diffing pub
> Index: pub/aviffpln.h
> ===================================================================
> RCS file: /cvsroot/datatype/avi/fileformat/pub/aviffpln.h,v
> retrieving revision 1.4.6.2
> diff -w -u -b -r1.4.6.2 aviffpln.h
> --- pub/aviffpln.h      2 Dec 2009 18:37:13 -0000       1.4.6.2
> +++ pub/aviffpln.h      26 Jan 2010 01:05:33 -0000
> @@ -318,6 +318,8 @@
> 
> void IOEvent();
> 
> +    void SendPacketReady(HX_RESULT rv, IHXPacket* pPacket);
> +
> char*  m_pszTitle;
> char*  m_pszAuthor;
> char*  m_pszCopyright;
> @@ -393,6 +395,7 @@
> , AS_GetODMLStreamFilePending // used to initialise stream for ODML index case
> #endif
> , AS_IOEvent                // PacketReady
> +        , AS_SendingPacketReady     // Packet sent to fileformat response obj. \
> Added to handle re-entrancy , AS_Ready
> , AS_Closed
> }
> 
> 
> 
> Index: CXPSFileformat.cpp
> ===================================================================
> RCS file: /cvsroot/datatype/xps/fileformat/CXPSFileformat.cpp,v
> retrieving revision 1.1.1.1.2.16
> diff -w -u -b -r1.1.1.1.2.16 CXPSFileformat.cpp
> --- CXPSFileformat.cpp  14 Sep 2009 05:41:06 -0000      1.1.1.1.2.16
> +++ CXPSFileformat.cpp  26 Jan 2010 01:06:27 -0000
> @@ -907,8 +907,9 @@
> {
> HXLOGL4(HXLOG_SXPS, "CXPSFileFormat::DispatchPkt GetPkt[%lu] TS:%lu Seq:%lu",
> uStreamid, pPacket->GetTime(), m_parrStreams[uStreamid].GetLastPktSeqNo());
> -                m_pFFResponse->PacketReady(HXR_OK, pPacket);
> m_parrStreams[uStreamid].SetGetPktStatus(FALSE);
> +                m_pFFResponse->PacketReady(HXR_OK, pPacket);
> +
> 
> if( (m_parrStreams[uStreamid].IsStreamDone()) &&
> (m_parrStreams[uStreamid].IsStreamEmpty()) )
> 
> 
> <ATT00001..txt>

Eric Hyche (ehyche@real.com)
Principal Engineer
RealNetworks, Inc.



_______________________________________________
Datatype-dev mailing list
Datatype-dev@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/datatype-dev


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic