[rbp/omxplayer] fixed pts/dts handling for omx video decoder
authorgimli <ebsi4711@gmail.com>
Fri, 14 Dec 2012 18:03:47 +0000 (19:03 +0100)
committergimli <ebsi4711@gmail.com>
Fri, 14 Dec 2012 18:05:39 +0000 (19:05 +0100)
xbmc/cores/omxplayer/OMXPlayerVideo.cpp
xbmc/cores/omxplayer/OMXVideo.cpp

index dfad9a9..6455419 100644 (file)
@@ -640,29 +640,23 @@ void OMXPlayerVideo::Process()
         if (pPacket->dts == DVD_NOPTS_VALUE && pPacket->pts == DVD_NOPTS_VALUE)
           output_pts = pts;
         else if (pPacket->pts == DVD_NOPTS_VALUE)
-          output_pts = pPacket->dts;
+          output_pts = pts;
         else
           output_pts = pPacket->pts;
 
         if(pPacket->pts != DVD_NOPTS_VALUE)
           pPacket->pts += m_iVideoDelay;
 
-        if(output_pts != DVD_NOPTS_VALUE)
-          output_pts += m_iVideoDelay;
+        if(pPacket->dts != DVD_NOPTS_VALUE)
+          pPacket->dts += m_iVideoDelay;
 
         if(pPacket->duration == 0)
           pPacket->duration = frametime;
 
-        switch(m_hints.codec)
-        {
-          case CODEC_ID_MPEG1VIDEO:
-          case CODEC_ID_MPEG2VIDEO:
-            m_omxVideo.Decode(pPacket->pData, pPacket->iSize, pPacket->pts, pPacket->pts);
-            break;
-          default:
-            m_omxVideo.Decode(pPacket->pData, pPacket->iSize, output_pts, output_pts);
-            break;
-        }
+        if(output_pts != DVD_NOPTS_VALUE)
+          pts = output_pts;
+
+        m_omxVideo.Decode(pPacket->pData, pPacket->iSize, pPacket->dts, pPacket->pts);
 
         Output(pPacket->iGroupId, output_pts, bRequestDrop);
 
index 9071492..06feb51 100644 (file)
@@ -741,17 +741,23 @@ int COMXVideo::Decode(uint8_t *pData, int iSize, double dts, double pts)
 
       if(m_av_clock->VideoStart())
       {
+        // only send dts on first frame to get nerly correct starttime
+        if(pts == DVD_NOPTS_VALUE)
+          pts = dts;
+        val  = (uint64_t)(pts == DVD_NOPTS_VALUE) ? 0 : pts;
+
         omx_buffer->nFlags = OMX_BUFFERFLAG_STARTTIME;
         CLog::Log(LOGDEBUG, "OMXVideo::Decode VDec : setStartTime %f\n", (float)val / DVD_TIME_BASE);
         m_av_clock->VideoStart(false);
+        omx_buffer->nTimeStamp = ToOMXTime(val);
       }
       else
       {
         if(pts == DVD_NOPTS_VALUE)
           omx_buffer->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
+        omx_buffer->nTimeStamp = ToOMXTime(val);
       }
 
-      omx_buffer->nTimeStamp = ToOMXTime(val);
 
       omx_buffer->nFilledLen = (demuxer_bytes > omx_buffer->nAllocLen) ? omx_buffer->nAllocLen : demuxer_bytes;
       memcpy(omx_buffer->pBuffer, demuxer_content, omx_buffer->nFilledLen);