@@ -97,6 +97,8 @@ const char* OMX_MediaProcessor::M_STATUS[] = {
97
97
98
98
#define INVOKE (...) \
99
99
QMetaObject::invokeMethod (this , __VA_ARGS__)
100
+ #define INVOKE_CONN \
101
+ Qt::QueuedConnection
100
102
101
103
/* ------------------------------------------------------------------------------
102
104
| get_mem_gpu
@@ -136,13 +138,27 @@ static void start_watchdog_once()
136
138
}
137
139
#endif // OMX_LOCK_WATCHDOG
138
140
141
+ /* ------------------------------------------------------------------------------
142
+ | OMX_MediaProcessorHelper::onFreeRequest
143
+ +-----------------------------------------------------------------------------*/
144
+ void OMX_MediaProcessorHelper::onFreeRequest ()
145
+ {
146
+ m_provider->free ();
147
+ m_provider->deinit ();
148
+ }
149
+
139
150
/* ------------------------------------------------------------------------------
140
151
| OMX_MediaProcessor::OMX_MediaProcessor
141
152
+-----------------------------------------------------------------------------*/
142
153
OMX_MediaProcessor::OMX_MediaProcessor (OMX_EGLBufferProviderSh provider) :
143
154
QObject(),
144
155
m_provider(provider),
145
- m_thread(new OMX_QThread),
156
+ #define THREADED_GL
157
+ #ifdef THREADED_GL
158
+ m_thread (new QThread),
159
+ #else
160
+ m_thread (QOpenGLContext::globalShareContext()->thread()),
161
+ #endif
146
162
m_state (STATE_INACTIVE),
147
163
m_mediaStatus(MEDIA_STATUS_NO_MEDIA),
148
164
m_sendCmd(QMutex::Recursive),
@@ -204,7 +220,7 @@ OMX_MediaProcessor::OMX_MediaProcessor(OMX_EGLBufferProviderSh provider) :
204
220
moveToThread (m_thread);
205
221
m_thread->start ();
206
222
207
- INVOKE (" init" );
223
+ INVOKE (" init" , INVOKE_CONN );
208
224
}
209
225
210
226
/* ------------------------------------------------------------------------------
@@ -213,16 +229,21 @@ OMX_MediaProcessor::OMX_MediaProcessor(OMX_EGLBufferProviderSh provider) :
213
229
void OMX_MediaProcessor::init ()
214
230
{
215
231
log_info (" Initializing GPU context in media processor..." );
216
- m_provider->init ();
232
+
233
+ const OMX_MediaProcessorHelper* helper = new OMX_MediaProcessorHelper (m_provider, m_thread);
217
234
218
235
connect (this , SIGNAL (destroyed (QObject*)),
219
- m_provider.get (), SLOT (free ()));
220
- connect (this , SIGNAL (destroyed (QObject*)),
221
- m_provider.get (), SLOT (deinit ()));
236
+ helper, SLOT (onFreeRequest ()));
222
237
connect (this , SIGNAL (destroyed (QObject*)),
223
- m_thread, SLOT (quit ()));
224
- connect (m_thread, SIGNAL (finished ()),
225
- m_thread, SLOT (deleteLater ()));
238
+ helper, SLOT (deleteLater ()));
239
+ if (m_thread != QOpenGLContext::globalShareContext ()->thread ()) {
240
+ connect (this , SIGNAL (destroyed (QObject*)),
241
+ m_thread, SLOT (quit ()));
242
+ connect (m_thread, SIGNAL (finished ()),
243
+ m_thread, SLOT (deleteLater ()));
244
+ }
245
+
246
+ m_provider->init ();
226
247
}
227
248
228
249
/* ------------------------------------------------------------------------------
@@ -257,7 +278,7 @@ QStringList OMX_MediaProcessor::streams()
257
278
+-----------------------------------------------------------------------------*/
258
279
bool OMX_MediaProcessor::setFilename (const QString& filename)
259
280
{
260
- return INVOKE (" setFilenameWrapper" , Q_ARG (QString, filename));
281
+ return INVOKE (" setFilenameWrapper" , INVOKE_CONN, Q_ARG (QString, filename));
261
282
}
262
283
263
284
/* ------------------------------------------------------------------------------
@@ -492,15 +513,15 @@ bool OMX_MediaProcessor::playInt()
492
513
+-----------------------------------------------------------------------------*/
493
514
bool OMX_MediaProcessor::play ()
494
515
{
495
- return INVOKE (" playInt" );
516
+ return INVOKE (" playInt" , INVOKE_CONN );
496
517
}
497
518
498
519
/* ------------------------------------------------------------------------------
499
520
| OMX_MediaProcessor::stop
500
521
+-----------------------------------------------------------------------------*/
501
522
bool OMX_MediaProcessor::stop ()
502
523
{
503
- return INVOKE (" stopInt" );
524
+ return INVOKE (" stopInt" , INVOKE_CONN );
504
525
}
505
526
506
527
/* ------------------------------------------------------------------------------
@@ -544,7 +565,7 @@ bool OMX_MediaProcessor::stopInt()
544
565
+-----------------------------------------------------------------------------*/
545
566
bool OMX_MediaProcessor::pause ()
546
567
{
547
- return INVOKE (" pauseInt" );
568
+ return INVOKE (" pauseInt" , INVOKE_CONN );
548
569
}
549
570
550
571
/* ------------------------------------------------------------------------------
@@ -680,8 +701,8 @@ bool OMX_MediaProcessor::muted()
680
701
void OMX_MediaProcessor::mediaDecoding ()
681
702
{
682
703
// See description in the qmakefile.
683
- // #define ENABLE_PROFILE_MAIN_LOOP
684
- // #define ENABLE_PAUSE_FOR_BUFFERING
704
+ // #define ENABLE_PROFILE_MAIN_LOOP
705
+ // #define ENABLE_PAUSE_FOR_BUFFERING
685
706
686
707
LOG_VERBOSE (LOG_TAG, " Decoding thread started." );
687
708
emit playbackStarted ();
@@ -928,9 +949,30 @@ void OMX_MediaProcessor::mediaDecoding()
928
949
if (!m_omx_pkt)
929
950
m_omx_pkt = m_omx_reader->Read ();
930
951
931
- if (m_omx_pkt)
952
+ if (m_omx_pkt) {
932
953
sendEos = false ;
933
954
955
+ // #define DUMP_FFMPEG_PACKETS
956
+ #ifdef DUMP_FFMPEG_PACKETS
957
+ OMXPacket* p = m_omx_pkt;
958
+ QFile f (" demuxed.txt" );
959
+ if (!f.open (QIODevice::WriteOnly | QIODevice::Append))
960
+ log_warn (" Failed to open file for writing frames." );
961
+ else {
962
+ QTextStream s (&f);
963
+ s << p->pts << " , "
964
+ << p->dts << " , "
965
+ << p->now << " , "
966
+ << p->duration << " , "
967
+ << p->size << " , "
968
+ << QByteArray::fromRawData ((const char *)p->data , p->size ) << " , "
969
+ << p->stream_index << " , "
970
+ << p->codec_type << " ." ;
971
+ }
972
+ f.close ();
973
+ #endif
974
+ }
975
+
934
976
if (UNLIKELY (m_omx_reader->IsEof () && !m_omx_pkt)) {
935
977
// demuxer EOF, but may have not played out data yet
936
978
if ((m_has_video && m_player_video->GetCached ()) ||
0 commit comments