[Android] Use length_change_monitor to wait until the demux is working
Edward Wang
git at videolan.org
Wed Jun 20 05:51:21 CEST 2012
android | branch: master | Edward Wang <edward.c.wang at compdigitec.com> | Tue Jun 19 23:49:29 2012 -0400| [d529d95f73b86052439c8644fce3b38f776f1518] | committer: Edward Wang
Use length_change_monitor to wait until the demux is working
Otherwise, on network streams this function would also return audio because the demux had not finished adding the es yet.
> http://git.videolan.org/gitweb.cgi/android.git/?a=commit;h=d529d95f73b86052439c8644fce3b38f776f1518
---
vlc-android/jni/libvlcjni.c | 39 ++++++++++++++++++++++++++++-----------
1 file changed, 28 insertions(+), 11 deletions(-)
diff --git a/vlc-android/jni/libvlcjni.c b/vlc-android/jni/libvlcjni.c
index c62d0c9..f6979ae 100644
--- a/vlc-android/jni/libvlcjni.c
+++ b/vlc-android/jni/libvlcjni.c
@@ -558,20 +558,37 @@ jboolean Java_org_videolan_vlc_LibVLC_hasVideoTrack(JNIEnv *env, jobject thiz,
libvlc_media_track_info_t *p_tracks;
libvlc_media_parse(p_m);
- jboolean hasVideo = JNI_FALSE;
- int i_nbTracks = libvlc_media_get_tracks_info(p_m, &p_tracks);
- unsigned i;
- for (i = 0; i < i_nbTracks; ++i)
- if (p_tracks[i].i_type == libvlc_track_video)
- {
- hasVideo = JNI_TRUE;
- break;
- }
+ libvlc_media_player_t* p_mp = libvlc_media_player_new_from_media(p_m);
- libvlc_media_tracks_info_release(p_tracks, i_nbTracks);
+ struct length_change_monitor* monitor;
+ monitor = malloc(sizeof(struct length_change_monitor));
+ if (!monitor) return 0;
+
+ /* Initialize pthread variables. */
+ pthread_mutex_init(&monitor->doneMutex, NULL);
+ pthread_cond_init(&monitor->doneCondVar, NULL);
+ monitor->length_changed = false;
+
+ libvlc_event_manager_t *ev = libvlc_media_player_event_manager(p_mp);
+ libvlc_event_attach(ev, libvlc_MediaPlayerLengthChanged, length_changed_callback, monitor);
+ libvlc_media_player_play( p_mp );
+
+ pthread_mutex_lock(&monitor->doneMutex);
+ while (!monitor->length_changed)
+ pthread_cond_wait(&monitor->doneCondVar, &monitor->doneMutex);
+ pthread_mutex_unlock(&monitor->doneMutex);
+
+ int i_nbTracks = libvlc_video_get_track_count(p_mp);
+ LOGI("Number of video tracks: %d",i_nbTracks);
+
+ libvlc_media_player_stop(p_mp);
+ libvlc_media_player_release(p_mp);
libvlc_media_release(p_m);
- return hasVideo;
+ if(i_nbTracks > 0)
+ return JNI_TRUE;
+ else
+ return JNI_FALSE;
}
jobjectArray Java_org_videolan_vlc_LibVLC_readTracksInfo(JNIEnv *env, jobject thiz,
More information about the Android
mailing list