| Summary: | FFMPEGMediaPlayer -vid -2 fail to decode and queue audio packets | ||
|---|---|---|---|
| Product: | [JogAmp] Jogl | Reporter: | Xerxes Rånby <xerxes> |
| Component: | util | Assignee: | Sven Gothel <sgothel> |
| Status: | RESOLVED FIXED | ||
| Severity: | enhancement | ||
| Priority: | --- | ||
| Version: | 2 | ||
| Hardware: | All | ||
| OS: | all | ||
| Type: | --- | SCM Refs: |
c6ab1bc932d9a0b3897b24d289e4d561bf8bb65c
a1be0f69bacb315e40a017b8997ef1c610da576e
8a8ed735f6631b2da7bf605c5c3dda4e0fc13905
d42b236ef139dcc8d8713535893c7870b55d420c
a0b23035bf9de987f5ad1b00fe3630c102f4e513
|
| Workaround: | --- | ||
|
Description
Xerxes Rånby
2013-12-03 19:43:19 CET
It is possible to reproduce this bug using the MovieSimple test by simply passing -vid -2 and produces no audio output for audio only playback. passing -vid -1 work and produce audio output for audio only playback. -2 == GLMediaPlayer.STREAM_ID_NONE == OFF -1 == AUTO Reproducer: java -cp jogamp-all-platforms/jar/jogl-test.jar:jogamp-all-platforms/jar/gluegen-rt.jar:jogamp-all-platforms/jar/jogl-all.jar:jogamp-all-platforms/jar/joal.jar com.jogamp.opengl.test.junit.jogl.demos.es2.av.MovieSimple -vid -2 Main issue:
StreamWorker did not get created and started for -vid -2
inside src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java
textureCount = 0; for -vid -2
StreamWorker is responsible for decoding both audio and video in a separate thread.
TODO: review StreamWorker for -vid -2
TODO: review StreamWorker, GLMediaPlayer and FFMPEGMediaPlayer when to stop using an audio only stream. The current implementation decide to stop when it encounter an end of stream _video_ frame.
Suggested fix:
diff --git a/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java b/src
index 86e19c9..7bc61b7 100644
--- a/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java
+++ b/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java
@@ -528,7 +528,7 @@ public abstract class GLMediaPlayerImpl implements GLMediaPl
this.vid = vid;
this.aid = aid;
if ( this.streamLoc != null ) {
- if( TEXTURE_COUNT_MIN < textureCount ) {
+ if( streamWorker == null ) {
streamWorker = new StreamWorker();
} else {
new Thread() {
Bug 918 (1/2): Use StreamWorker in 'Audio Only' mode, since no 'getNextTexture(..)' is issued here! Thanks to Xerxes to analyze this issue thoroughly. TODO: Implement EOS for 'Audio Only' and test seek, pause, etc .. - Apply manual tests in MovieSimple a1be0f69bacb315e40a017b8997ef1c610da576e
GLMediaPlayer: Fix Deadlock if EOS happens after pause/resume (seek) -
Tested w/ seeking 'Audio Only' and Matroska
Test stream was default of MovieSimple:
http://video.webmfiles.org/big-buck-bunny_trailer.webm
while disabling video (-vid -2)
8a8ed735f6631b2da7bf605c5c3dda4e0fc13905
Determine StreamWorker usage after init
- To support audio only files, we need to determine to use StreamWorker
after completion of stream-init.
Fix seek(..)
- FFMPeg: pos0 needs to use aPTS for audio-only
- Clip target time [0..duration[
Fallback for EOS Detection
In case the backend does not report proper EOS:
- Utilize 'nullFramesCount >= MAX' -> EOS,
where MAX is number of frames for 3s play duraction
and where 'nullFramesCount' is increased if no valid packet is available
and no decoded-video or -audio in the queue.
- Utilize pts > duration -> EOS
MovieSimple uses full GLEventListener for 'Audio Only' as well to test seek
- Matroska seek for audio-only leads to EOS ..
http://video.webmfiles.org/big-buck-bunny_trailer.webm
- MP4 audio-only seek works
http://download.blender.org/peach/bigbuckbunny_movies/BigBuckBunny_320x180.mp4
MovieSimple/MovieCube:
- Use audio-pts in audio-only to calc target time
Tested:
- A, V and A+V
- Pause, Stop and Seek
- GNU/Linux
d42b236ef139dcc8d8713535893c7870b55d420c
ALAudioSink: Fix stop and flush of OpenAL source
- stopImpl() shall always issue alSourceStop(..) if state is not STOPPED
- Remove 'flush' hint for dequeueBuffer(..), we perform proper flush in respective method, see below
- flush() needs to issue:
- stopImpl() - which should already dequeue all buffers
- Explicitly dequeue all buffers: via 'alSourcei(alSource[0], AL.AL_BUFFER, 0)'
- Then dequeue manually processed buffers: dequeueBuffer( false /* wait */ );
- And dequeue _all_ buffers: dequeueForceAll();
a0b23035bf9de987f5ad1b00fe3630c102f4e513
Fix EOS Regression: Only use pts>duration for EOS if duration > 0
(camera or other sources may not have duration)
Regression of commit 8a8ed735f6631b2da7bf605c5c3dda4e0fc13905
Tested on Android as well ..
|