<div dir="ltr"><div><div>Hi,<br><br>Thanks for the help. This is the first time I send a significant change to VLC. <br><br>Do you want me to spli these patches ?<br></div>Any suggestion of name ?<br><br></div>Thank you<br>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-07-23 12:50 GMT-03:00 Jean-Baptiste Kempf <span dir="ltr"><<a href="mailto:jb@videolan.org" target="_blank">jb@videolan.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On 23 Jul, Paulo Vitor Magacho da Silva wrote :<br>
<div class="">> +            setInt(env, item, "Bitrate", p_tracks[i]->i_bitrate);<br>
<br>
</div>This should be in a different patch.<br>
<div><div class="h5"><br>
> +jobject Java_org_videolan_libvlc_LibVLC_getStats(JNIEnv *env, jobject thiz)<br>
> +{<br>
> +    libvlc_media_player_t *mp = getMediaPlayer(env, thiz);<br>
> +    if (!mp)<br>
> +        return NULL;<br>
> +<br>
> +    libvlc_media_t *p_mp = libvlc_media_player_get_media(mp);<br>
> +    if (!p_mp)<br>
> +        return NULL;<br>
> +<br>
> +    libvlc_media_stats_t p_stats;<br>
> +    libvlc_media_get_stats(p_mp, &p_stats);<br>
> +<br>
> +    jclass mapClass = (*env)->FindClass(env, "java/util/Map");<br>
> +    jclass hashMapClass = (*env)->FindClass(env, "java/util/HashMap");<br>
> +    jmethodID mapPut = (*env)->GetMethodID(env, mapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");<br>
> +    /*<br>
> +     * "What are you building? Lay your hand on it. Where is it?"<br>
> +     * We need a concrete map to start<br>
> +     */<br>
> +    jmethodID mapInit = (*env)->GetMethodID(env, hashMapClass, "<init>", "()V");<br>
> +    jclass integerCls = (*env)->FindClass(env, "java/lang/Integer");<br>
> +    jmethodID integerConstructor = (*env)->GetMethodID(env, integerCls, "<init>", "(I)V");<br>
> +    jclass floatCls = (*env)->FindClass(env, "java/lang/Float");<br>
> +    jmethodID floatConstructor = (*env)->GetMethodID(env, floatCls, "<init>", "(F)V");<br>
> +<br>
> +     LOGE("No media player %f", p_stats.f_demux_bitrate);<br>
> +<br>
> +    jobject statistics = (*env)->NewObject(env, hashMapClass, mapInit);<br>
> +    jobject value = (*env)->NewObject(env, floatCls, floatConstructor, p_stats.f_demux_bitrate);<br>
> +    jstring name = (*env)->NewStringUTF(env, "demuxBitrate");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, floatCls, floatConstructor, p_stats.f_input_bitrate);<br>
> +    name = (*env)->NewStringUTF(env, "inputBitrate");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, floatCls, floatConstructor, p_stats.f_send_bitrate);<br>
> +    name = (*env)->NewStringUTF(env, "sendBitrate");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_decoded_audio);<br>
> +    name = (*env)->NewStringUTF(env, "decodedAudio");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_decoded_video);<br>
> +    name = (*env)->NewStringUTF(env, "decodedVideo");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_demux_corrupted);<br>
> +    name = (*env)->NewStringUTF(env, "demuxCorrupted");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_demux_discontinuity);<br>
> +    name = (*env)->NewStringUTF(env, "demuxDiscontinuity");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_demux_read_bytes);<br>
> +    name = (*env)->NewStringUTF(env, "demuxReadBytes");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_displayed_pictures);<br>
> +    name = (*env)->NewStringUTF(env, "displayedPictures");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_lost_abuffers);<br>
> +    name = (*env)->NewStringUTF(env, "lostAbuffers");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_lost_pictures);<br>
> +    name = (*env)->NewStringUTF(env, "lostPictures");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_played_abuffers);<br>
> +    name = (*env)->NewStringUTF(env, "playedAbuffers");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_read_bytes);<br>
> +    name = (*env)->NewStringUTF(env, "readBytes");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, value, name);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_sent_bytes);<br>
> +    name = (*env)->NewStringUTF(env, "sentBytes");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    value = (*env)->NewObject(env, integerCls, integerConstructor, p_stats.i_sent_packets);<br>
> +    name = (*env)->NewStringUTF(env, "sentPackets");<br>
> +    (*env)->CallObjectMethod(env, statistics, mapPut, name, value);<br>
> +<br>
> +    // Clean up local references<br>
> +    (*env)->DeleteLocalRef(env, mapClass);<br>
> +    (*env)->DeleteLocalRef(env, hashMapClass);<br>
> +    (*env)->DeleteLocalRef(env, integerCls);<br>
> +    (*env)->DeleteLocalRef(env, floatCls);<br>
> +<br>
> +    return statistics;<br>
> +}<br>
<br>
</div></div>And this one in another one.<br>
<div class=""><br>
> diff --git a/vlc-android/jni/libvlcjni.c b/vlc-android/jni/libvlcjni.c<br>
> index 9781d76..fa9b6ad 100644<br>
> --- a/vlc-android/jni/libvlcjni.c<br>
> +++ b/vlc-android/jni/libvlcjni.c<br>
> @@ -137,9 +137,13 @@ static void vlc_event_callback(const libvlc_event_t *ev, void *data)<br>
>      jmethodID putString = (*env)->GetMethodID(env, clsBundle, "putString", "(Ljava/lang/String;Ljava/lang/String;)V" );<br>
><br>
>      if (ev->type == libvlc_MediaPlayerPositionChanged) {<br>
> -            jstring sData = (*env)->NewStringUTF(env, "data");<br>
> -            (*env)->CallVoidMethod(env, bundle, putFloat, sData, ev->u.media_player_position_changed.new_position);<br>
> -            (*env)->DeleteLocalRef(env, sData);<br>
> +        jstring sData = (*env)->NewStringUTF(env, "data");<br>
> +        (*env)->CallVoidMethod(env, bundle, putFloat, sData, ev->u.media_player_position_changed.new_position);<br>
> +        (*env)->DeleteLocalRef(env, sData);<br>
> +    } else if (ev->type == libvlc_MediaPlayerTimeChanged) {<br>
> +        jstring sData = (*env)->NewStringUTF(env, "data");<br>
> +        (*env)->CallVoidMethod(env, bundle, putInt, sData, (int) ev->u.media_player_time_changed.new_time);<br>
> +        (*env)->DeleteLocalRef(env, sData);<br>
<br>
</div>This in a different one again.<br>
<div class=""><br>
> +     vlc_object *object = (vlc_object *) malloc(sizeof(vlc_object));<br>
<br>
</div>malloc MUST be checked.<br>
<div class=""><br>
> +        /* Enable statistics */<br>
> +        "--stats",<br>
<br>
</div>This should be in the stats patch.<br>
<div class=""><br>
>      jlong libVlcInstance = getLong(env, thiz, "mLibVlcInstance");<br>
> @@ -378,6 +397,7 @@ void Java_org_videolan_libvlc_LibVLC_playMRL(JNIEnv *env, jobject thiz, jlong in<br>
>          libvlc_MediaPlayerStopped,<br>
>          libvlc_MediaPlayerVout,<br>
>          libvlc_MediaPlayerPositionChanged,<br>
> +        libvlc_MediaPlayerTimeChanged,<br>
>          libvlc_MediaPlayerEncounteredError<br>
>      };<br>
<br>
</div>And that one in the event patch.<br>
<div class=""><br>
> +#include <pthread.h><br>
> +<br>
> +typedef struct vlc_object {<br>
> +     pthread_mutex_t vout_android_lock;<br>
> +     pthread_cond_t vout_android_surf_attached;<br>
> +     void *vout_android_surf;<br>
> +     void *vout_android_gui;<br>
> +     jobject vout_android_java_surf;<br>
> +     jobject vout_android_subtitles_surf;<br>
> +     bool vout_video_player_activity_created;<br>
> +} vlc_object;<br>
<br>
</div>vlc_object is an extremely bad name.<br>
<br>
With my kindest regards,<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Jean-Baptiste Kempf<br>
<a href="http://www.jbkempf.com/" target="_blank">http://www.jbkempf.com/</a> - <a href="tel:%2B33%20672%20704%20734" value="+33672704734">+33 672 704 734</a><br>
Sent from my Electronic Device<br>
_______________________________________________<br>
Android mailing list<br>
<a href="mailto:Android@videolan.org">Android@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/android" target="_blank">https://mailman.videolan.org/listinfo/android</a><br>
</font></span></blockquote></div><br></div>