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);
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);