static jobject _make_playlist_info(JNIEnv* env, BLURAY_TITLE_INFO* ti) { jobjectArray marks = bdj_make_array(env, "org/videolan/TIMark", ti->mark_count); for (uint32_t i = 0; i < ti->mark_count; i++) { BLURAY_TITLE_MARK m = ti->marks[i]; jobject mark = bdj_make_object(env, "org/videolan/TIMark", "(IIJJJI)V", m.idx, m.type, m.start, m.duration, m.offset, m.clip_ref); (*env)->SetObjectArrayElement(env, marks, i, mark); } jobjectArray clips = bdj_make_array(env, "org/videolan/TIClip", ti->clip_count); for (uint32_t i = 0; i < ti->clip_count; i++) { BLURAY_CLIP_INFO info = ti->clips[i]; jobjectArray videoStreams = _make_stream_array(env, info.video_stream_count, info.video_streams); jobjectArray audioStreams = _make_stream_array(env, info.audio_stream_count, info.audio_streams); jobjectArray pgStreams = _make_stream_array(env, info.pg_stream_count, info.pg_streams); jobjectArray igStreams = _make_stream_array(env, info.ig_stream_count, info.ig_streams); jobjectArray secVideoStreams = _make_stream_array(env, info.sec_video_stream_count, info.sec_video_streams); jobjectArray secAudioStreams = _make_stream_array(env, info.sec_audio_stream_count, info.sec_audio_streams); jobject clip = bdj_make_object(env, "org/videolan/TIClip", "(I[Lorg/videolan/StreamInfo;[Lorg/videolan/StreamInfo;[Lorg/videolan/StreamInfo;[Lorg/videolan/StreamInfo;[Lorg/videolan/StreamInfo;[Lorg/videolan/StreamInfo;)V", i, videoStreams, audioStreams, pgStreams, igStreams, secVideoStreams, secAudioStreams); (*env)->SetObjectArrayElement(env, clips, i, clip); } return bdj_make_object(env, "org/videolan/PlaylistInfo", "(IJI[Lorg/videolan/TIMark;[Lorg/videolan/TIClip;)V", ti->playlist, ti->duration, ti->angle_count, marks, clips); }
static jobject _make_title_info(JNIEnv* env, int title, int objType, int playbackType, const char* bdjoName, int hdmvOID) { jstring name = bdjoName ? (*env)->NewStringUTF(env, bdjoName) : NULL; jobject ti = bdj_make_object(env, "org/videolan/TitleInfo", "(IIILjava/lang/String;I)V", title, objType, playbackType, name, hdmvOID); if (name) (*env)->DeleteLocalRef(env, name); return ti; }
static jobject _make_title_info(JNIEnv* env, const BLURAY_TITLE *title, int title_number) { jobject ti = NULL; if (title) { int title_type = title->bdj ? 2 : 1; int playback_type = (!!title->interactive) + ((!!title->bdj) << 1); ti = bdj_make_object(env, "org/videolan/TitleInfo", "(IIII)V", title_number, title_type, playback_type, title->id_ref); } return ti; }
static jobjectArray _make_stream_array(JNIEnv* env, int count, BLURAY_STREAM_INFO* streams) { jobjectArray streamArr = bdj_make_array(env, "org/videolan/StreamInfo", count); for (int i = 0; i < count; i++) { BLURAY_STREAM_INFO s = streams[i]; jstring lang = (*env)->NewStringUTF(env, (char*)s.lang); jobject streamObj = bdj_make_object(env, "org/videolan/StreamInfo", "(BBBCLjava/lang/String;BB)V", s.coding_type, s.format, s.rate, s.char_code, lang, s.aspect, s.subpath_id); (*env)->SetObjectArrayElement(env, streamArr, i, streamObj); } return streamArr; }