/** * \brief Get formats supported by native capture device. * \param env JNI environment * \param obj DSCaptureDevice object * \param ptr native pointer of DSCaptureDevice * \return array of DSFormat object */ JNIEXPORT jobjectArray JNICALL Java_org_jitsi_impl_neomedia_jmfext_media_protocol_directshow_DSCaptureDevice_getSupportedFormats (JNIEnv* env, jobject obj, jlong ptr) { jobjectArray ret = NULL; DSCaptureDevice* dev = reinterpret_cast<DSCaptureDevice*>(ptr); std::list<DSFormat> formats; jclass clazzDSFormat = NULL; jmethodID initDSFormat = NULL; jsize i = 0; /* get DSFormat class to instantiate some object */ clazzDSFormat = env->FindClass("org/jitsi/impl/neomedia/jmfext/media/protocol/directshow/DSFormat"); if(clazzDSFormat == NULL) return NULL; initDSFormat = env->GetMethodID(clazzDSFormat, "<init>", "(III)V"); if(initDSFormat == NULL) return NULL; formats = dev->getSupportedFormats(); ret = env->NewObjectArray(static_cast<jsize>(formats.size()), clazzDSFormat, NULL); for(std::list<DSFormat>::iterator it = formats.begin() ; it != formats.end() ; ++it) { DSFormat tmp = (*it); jobject o = env->NewObject( clazzDSFormat, initDSFormat, static_cast<jint>(tmp.width), static_cast<jint>(tmp.height), static_cast<jint>(tmp.pixelFormat)); if(o == NULL) { fprintf(stderr, "failed!!\n"); fflush(stderr); } else { env->SetObjectArrayElement(ret, i, o); env->DeleteLocalRef(o); i++; } } return ret; }