android - Resize video frame using FFMPEG -
i need resize camera preview frame using ffmpeg. have done writing ffmpeg code , related java code i'm doing send byte[] native code , output in other byte[] i'm getting output buffer 0 in native code.
here native code:
jint java_com_sample_ffmpegndk_resizerawimage( jnienv *env, jobject thiz, jbytearray input_array, jarray output_array, jint width, jint height) { jbyte *data; jsize array_size = (*env)->getarraylength(env, input_array); data = (*env)->getbytearrayelements(env, input_array, null); logd_custom(env, "data length: (%d)", strlen(data)); logd_custom(env, "array length: (%d)", array_size); avframe *frame1 = av_frame_alloc(); avpicture_fill((avpicture*)frame1, data, av_pix_fmt_nv12, 720, 480); struct swscontext *resize; resize = sws_getcontext(720, 480, av_pix_fmt_nv12, width, height, av_pix_fmt_nv12, sws_bicubic, null, null, null); avframe* frame2 = av_frame_alloc(); int num_bytes = avpicture_get_size(av_pix_fmt_nv12, width, height); uint8_t* frame2_buffer = (uint8_t *)av_malloc(num_bytes); avpicture_fill((avpicture*)frame2, frame2_buffer, av_pix_fmt_nv12, width, height); logd_custom(env, "frame1 data: (%d)", strlen(frame1->data)); sws_scale(resize, frame1->data, frame1->linesize, 0, height, frame2->data, frame2->linesize); logd_custom(env, "frame2 data: (%d)", strlen(frame2->data)); (*env)->releasebytearrayelements(env, output_array, (jbyte*)frame2->data, jni_abort); jsize array_size_s = (*env)->getarraylength(env, output_array); logd_custom(env, "array length after: (%d)", array_size_s); sws_freecontext(resize); free(data); return 0; } and code i'm getting camera preview
mycamera.setpreviewcallback(new camera.previewcallback() { @override public void onpreviewframe(final byte[] data, camera camera) { if (data != null) { byte[] new_data = new byte[1024]; log.e("lenght", "iip lenght : " + data.length); ffmpegndk.resizerawimage(data, new_data, 480, 270); log.e("lenght", "oip lenght : " + new_data.length); } } });
i think jni_abort reason that, flag prevents jvm copying data client.
try changing line
(*env)->releasebytearrayelements(env, output_array, (jbyte*)frame2->data, jni_abort); to
(*env)->releasebytearrayelements(env, output_array, (jbyte*)frame2->data, jni_commit); jni_commit copy data, , need free frame buffer
av_frame_free(&frame2) for more info please check http://developer.android.com/training/articles/perf-jni.html#arrays
Comments
Post a Comment