input_bufs_omx_free.clear();
input_bufs_omx_present.clear();
input_time_present.clear();
+ input_time_pts.clear();
input_is_last.clear();
input_bufs_omx_mutex.Unlock();
ULLONG VideoOMX::getCurrentTimestamp()
{
if (iframemode) return 0;
- return lastreftimePTS;
+ return cur_pts;
}
// to be removed
lastrefvideotime=0;
lastreftimeOMX=0;
lastreftimePTS=0;
+ cur_pts=0;
}
long long VideoOMX::GetCurrentSystemTime()
if (!paused) {
input_bufs_omx_mutex.Lock();
if (input_bufs_omx_present.size()>0) {
-
+ cur_pts=input_time_pts.front();
pict=input_bufs_omx_present.front();
time=input_time_present.front();
islast=input_is_last.front();
input_bufs_omx_present.pop_front();
input_time_present.pop_front();
+ input_time_pts.pop_front();
input_is_last.pop_front();
}
input_bufs_omx_mutex.Unlock();
}
-void VideoOMX::PutBufferToPres(OMX_BUFFERHEADERTYPE* buffer, long long time,bool islast)
+void VideoOMX::PutBufferToPres(OMX_BUFFERHEADERTYPE* buffer, long long time, long long pts,bool islast)
{
input_bufs_omx_mutex.Lock();
input_bufs_omx_present.push_back(buffer);
input_time_present.push_back(time);
+ input_time_pts.push_back(pts);
input_is_last.push_back(islast);
input_bufs_omx_mutex.Unlock();
if (packet.disconti) {
firstsynched=false;
if (cur_input_buf_omx) {
- PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,true);
+ PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,lastreftimePTS, true);
cur_input_buf_omx=NULL;
}
}
if ( packet.synched ) {
if (cur_input_buf_omx) {
cur_input_buf_omx->nFlags|=OMX_BUFFERFLAG_ENDOFFRAME;
- PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,true);
+ PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,lastreftimePTS,true);
cur_input_buf_omx=NULL;//write out old data
*samplepos+=cancopy;
// push old buffer out
- PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,false);
+ PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,lastreftimePTS,false);
cur_input_buf_omx=NULL;
// get5 new buffer
input_bufs_omx_mutex.Lock();
}
cur_input_buf_omx->nTimeStamp = 0;
- PutBufferToPres(cur_input_buf_omx, 0,false);
+ PutBufferToPres(cur_input_buf_omx, 0,0,false);
cur_input_buf_omx = NULL;
if (!cur_input_buf_omx) {
}
cur_input_buf_omx->nTimeStamp = 0;
- PutBufferToPres(cur_input_buf_omx, 0,false);
+
+ PutBufferToPres(cur_input_buf_omx, 0,0,false);
cur_input_buf_omx = NULL;
int VideoOMX::EnterIframePlayback()
{
- clock_mutex.Lock();
if (cur_input_buf_omx) {
- PutBufferToPres(cur_input_buf_omx, lastreftimeOMX,true);
-
+ PutBufferToPres(cur_input_buf_omx, lastreftimeOMX, lastreftimePTS,true);
cur_input_buf_omx = NULL;
}
- clock_mutex.Unlock();
+ input_bufs_omx_mutex.Lock();
+ while (input_bufs_omx_present.size()) {
+ input_bufs_omx_free.push_back(input_bufs_omx_present.front());
+ input_bufs_omx_present.pop_front();
+ }
+ input_time_present.clear();
+ input_time_pts.clear();
+ input_is_last.clear();
+ input_bufs_omx_mutex.Unlock();
+
iframemode=true;
return 1;
long long startoffset;\r
long long lastrefvideotime;\r
long long lastrefaudiotime;\r
+ long long cur_pts;
OMX_TICKS lastreftimeOMX;\r
ULLONG lastreftimePTS;\r
\r
list<OMX_BUFFERHEADERTYPE*> input_bufs_omx_free;\r
list<OMX_BUFFERHEADERTYPE*> input_bufs_omx_present;\r
list<long long> input_time_present;\r
+ list<long long> input_time_pts;\r
list<bool> input_is_last;\r
Mutex input_bufs_omx_mutex;\r
OMX_BUFFERHEADERTYPE* cur_input_buf_omx;\r
\r
- void PutBufferToPres(OMX_BUFFERHEADERTYPE* buffer, long long time,bool is_last);\r
+ void PutBufferToPres(OMX_BUFFERHEADERTYPE* buffer, long long time,long long pts, bool is_last);\r
void threadMethod();\r
void threadPostStopCleanup();\r
\r