[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