Returning a bitmap from a video using JNI


I am using the following code to return a bitmap from a video using jni then to display it using c++ and Openframeworks.You may not be familiar with Openframeworks but it's just the last step, possibly there is an error with my code before using Openframeworks' ofImage object.

These codes are able to grab a frame from a video and then display it but unfortunately instead of one full image it displays four small images next to each other.How can I solve this problem?

Here is the code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
setup() function:
{


jclass bitmapConfig = (*env)-> FindClass(env,"android/graphics/Bitmap$Config");

jfieldID rgba8888FieldID = (*env)->GetStaticFieldID(env,bitmapConfig, "ARGB_8888", "Landroid/graphics/Bitmap$Config;");

jobject rgba8888Obj = (*env)->GetStaticObjectField(env,bitmapConfig, rgba8888FieldID);

jclass mediadataret = (*env) -> FindClass(env,"android/media/MediaMetadataRetriever");
   
jmethodID medID = (*env)->GetMethodID(env,mediadataret,"<init>","()V");

jstring str1 = (*env)->NewStringUTF (env, "/storage/emulated/0/deneme1/MOV_0270.mp4" ) ;
  

(*env)->CallVoidMethod(env,mediadatart,medID2,str1);
 
jclass classbitmap = (*env)->FindClass(env,"android/graphics/Bitmap");
   

jmethodID createBitmapMethodID = (*env)()-> GetStaticMethodID(env,classbitmap,"createBitmap",
(IILandroid/graphics/Bitmap$Config;)                                                     
Landroid/graphics/Bitmap;");

jobject bitmap1= (*env)->CallStaticObjectMethod(env,classbitmap, createBitmapMethodID, _width,_height, rgba8888Obj);


jmethodID medID3 = (*env)->GetMethodID(env,mediadataret,"getFrameAtTime","(J)Landroid/graphics/Bitmap;");
  
bitmap1 = (*env)->CallObjectMethod(env,mediadatart,medID3,framenum);

jmethodID metID4 = (*env)->GetMethodID(env,classbitmap,"getPixels","([IIIIIII)V");
jmethodID widthget = (*env)->GetMethodID(env,classbitmap,"getWidth","()I");
jmethodID heightget = (*env)->GetMethodID(env,classbitmap,"getHeight","()I");
 


jlong framenum=7*1000;
  
jint offset=0;
jint stride=1;
jint x=0;
jint y=0;
jint width= (*env)->CallIntMethod(env,bitmap1,widthget);
jint height = (*env)->CallIntMethod(env,bitmap1,heightget);

jintArray pixels = (*env)->NewIntArray(env,width * height*4);

(*env)-> CallVoidMethod(env, bitmap1,metID4,pixels,offset,width,x,y,width,height);


int* pixelsp = new int[width*height*4];

(*env)->GetIntArrayRegion(env,pixels,0,width*height,pixelsp);

bitmap = new unsigned char[width*height*4];


for (int y=0; y<height; y++) {
        for (int x=0; x<width; x++) {
            

            int index = 4 * ( x + width * y );
            unsigned char red = pixelsp[index]>>16 ;
            unsigned char green = pixelsp[index+1 ]>>8;
            unsigned char blue = pixelsp[index+2];
            unsigned char alpha = pixelsp[index+3] >> 24;


            bitmap[index]=red;
            bitmap[index+1]=green;
            bitmap[index+2]=blue;
            bitmap[index+3]=alpha;

           
 

       }

}

image1.setFromPixels(bitmap, width, height, ofImageType::OF_IMAGE_COLOR_ALPHA,true);
  
ofBackground(255,255,255);

width__=width;
height__=height;

}


draw() function:
{
ofSetColor( 255, 255, 255 );
image1.draw(50,50,width__,height__); 
Last edited on
Topic archived. No new replies allowed.