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

List:       helix-datatype-cvs
Subject:    [Datatype-cvs] mpeg2ts/fileformat tsfformat.cpp, 1.20.2.11.2.16, 1.20.2.11.2.17
From:       ching_li () helixcommunity ! org
Date:       2012-06-12 7:45:02
[Download RAW message or body]

Update of /cvsroot/datatype/mpeg2ts/fileformat
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv6307/fileformat

Modified Files:
      Tag: hxclient_3_6_1_atlas
	tsfformat.cpp 
Log Message:
2) For ts/m2ts file format, since we load the packet data in async mode, it is easy \
to run into rebuffer logic when play some 1080p contents and HLS, so load data \
immediately in the CTSFileFormat::GetPacket function and add "preload" mechanism.



Index: tsfformat.cpp
===================================================================
RCS file: /cvsroot/datatype/mpeg2ts/fileformat/tsfformat.cpp,v
retrieving revision 1.20.2.11.2.16
retrieving revision 1.20.2.11.2.17
diff -u -d -r1.20.2.11.2.16 -r1.20.2.11.2.17
--- tsfformat.cpp	28 May 2012 12:51:48 -0000	1.20.2.11.2.16
+++ tsfformat.cpp	12 Jun 2012 07:45:00 -0000	1.20.2.11.2.17
@@ -112,6 +112,7 @@
 #endif
 #ifdef ANDROID
     , m_pScheduler(NULL)
+    , m_hPendingCallback(0)
 #endif
     , m_ullFileSize(0)
     , m_ullFileOffset(0)
@@ -467,10 +468,9 @@
 STDMETHODIMP CTSFileFormat::GetPacket(UINT16 usStreamNo)
 {
     HX_RESULT retVal = HXR_UNEXPECTED;
-    UINT32 ulStreamNum = (UINT32) usStreamNo;
-    if (m_pStreamInfo && ulStreamNum < m_ulStreamCount)
+    if (m_pStreamInfo && usStreamNo < (UINT16)m_ulStreamCount)
     {
-        if (!m_pStreamInfo[ulStreamNum].m_bStreamDone)
+        if (!m_pStreamInfo[usStreamNo].m_bStreamDone)
         {
             // there is no StreamDone issued.
             // try to get packet from demuxer
@@ -482,31 +482,27 @@
                 m_bNeedKeyFrame = FALSE;
 
                 // send packet via FF response
-                m_pStreamInfo[ulStreamNum].m_bPacketRequested = FALSE;
+                m_pStreamInfo[usStreamNo].m_bPacketRequested = FALSE;
                 m_pFFResponse->PacketReady(HXR_OK, pPacket);
                 HX_RELEASE(pPacket);
+                PreloadPacketsIfNeed();
             }
-            else if (retVal == HXR_NO_DATA && \
!m_pStreamInfo[ulStreamNum].m_bPacketRequested) +            else if (retVal == \
HXR_NO_DATA)  {
                 // demuxer's packet queue is empty
                 // clear error and mark pending request
                 retVal = HXR_OK;
-                m_pStreamInfo[ulStreamNum].m_bPacketRequested = TRUE;
+                m_pStreamInfo[usStreamNo].m_bPacketRequested = TRUE;
 
                 if (m_bEndOfFileReached)
                 {
                     // Stream Done
-                    m_pStreamInfo[ulStreamNum].m_bStreamDone = TRUE;
-                    m_pStreamInfo[ulStreamNum].m_bPacketRequested = FALSE;
-                    m_pFFResponse->StreamDone((UINT16) ulStreamNum);
+                    m_pStreamInfo[usStreamNo].m_bStreamDone = TRUE;
+                    m_pStreamInfo[usStreamNo].m_bPacketRequested = FALSE;
+                    m_pFFResponse->StreamDone(usStreamNo);
                 }
                 else if (m_eStatus == Ready)
                 {
-// on android platform, the m_pFileObject64->Read is immplemented as sync mode 
-#ifdef ANDROID
-                    // schedule this callback to read more data.
-                    m_pScheduler->RelativeEnter(this, 0);
-#else
                     UINT64 ullReadSize = m_bUseRawDTS? m_ulTSReadSize: \
(m_ullFileSize - m_ullFileOffset);  if (ullReadSize > m_ulTSReadSize)
                     {
@@ -520,7 +516,6 @@
                     else
 #endif
                         retVal = m_pFileObject->Read( (UINT32)ullReadSize );
-#endif
                 }
                 else if (m_eStatus != GetPacketReadPending)
                 {
@@ -532,9 +527,9 @@
             {
                 m_LastError = retVal;
                 // Stream Done
-                m_pStreamInfo[ulStreamNum].m_bStreamDone = TRUE;
-                m_pStreamInfo[ulStreamNum].m_bPacketRequested = FALSE;
-                m_pFFResponse->StreamDone((UINT16) ulStreamNum);
+                m_pStreamInfo[usStreamNo].m_bStreamDone = TRUE;
+                m_pStreamInfo[usStreamNo].m_bPacketRequested = FALSE;
+                m_pFFResponse->StreamDone(usStreamNo);
             }
 
             // Release the packet
@@ -554,7 +549,7 @@
     {      
     case GetPacketReadPending:
     case Ready:
-        m_eStatus = SeekSeekPending;      
+        m_eStatus = SeekSeekPending;
     case SeekSeekPending:     
     {
         for (UINT16 i=0; i<(UINT16)m_ulStreamCount; i++)
@@ -1059,7 +1054,7 @@
 // on android platform, the m_pFileObject64->Read is immplemented as sync mode 
 #ifdef ANDROID
                             // schedule this callback to read more data.
-                            m_pScheduler->RelativeEnter(this, 0);
+                            m_hPendingCallback = m_pScheduler->RelativeEnter(this, \
0);  #else
                             UINT64 ullReadSize = m_bUseRawDTS? m_ulTSReadSize: \
(m_ullFileSize - m_ullFileOffset);  if (ullReadSize > m_ulTSReadSize)
@@ -1088,6 +1083,8 @@
                     }
                 }
             }
+
+            PreloadPacketsIfNeed();
         }
 
         break;
@@ -1425,10 +1422,36 @@
     return ret;
 }
 
+void
+CTSFileFormat::PreloadPacketsIfNeed()
+{
+#ifdef ANDROID
+    if (Ready == m_eStatus && !m_bEndOfFileReached && !m_hPendingCallback)
+    {
+        for (UINT16 i=0; i<(UINT16)m_ulStreamCount; i++)
+        {
+            if ( m_pTSDemuxer->IsEnabled(i) )
+            {
+                if (  ( m_pTSDemuxer->IsVideoStream(i) &&
+                        m_pTSDemuxer->GetPacketCount(i) < 5 ) ||
+                      ( m_pTSDemuxer->IsAudioStream(i) &&
+                        m_pTSDemuxer->GetPacketCount(i) < 5 )  )
+                {
+                    // schedule this callback to read more data.
+                    m_hPendingCallback = m_pScheduler->RelativeEnter(this, 0);
+                    break;
+                }
+            }
+        }
+    }
+#endif
+}
+
 #ifdef ANDROID
 STDMETHODIMP CTSFileFormat::Func()
 {
-    if (!m_bEndOfFileReached && m_pFileObject)
+    m_hPendingCallback = 0;
+    if (Ready == m_eStatus && !m_bEndOfFileReached && m_pFileObject)
     {
         UINT64 ullReadSize = m_bUseRawDTS? m_ulTSReadSize: (m_ullFileSize - \
m_ullFileOffset);  if (ullReadSize > m_ulTSReadSize)


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


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

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