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

Popular posts from this blog

shopping cart - Page redirect not working PHP -

php - How to modify a menu to show sub-menus -

python - Installing PyDev in eclipse is failed -