Jogamp
1ca973097cc34f73c74a1fd105276f413b5aa84c
[jogl.git] / src / jogl / native / openmax / com_sun_openmax_OMXInstance.c
1 /*
2  *  javafx_media_video_Movie.c
3  *  JFXFramework
4  *
5  *  Created by sun on 17/02/08.
6  *  Copyright 2007 __MyCompanyName__. All rights reserved.
7  *
8  */
9
10 // http://developer.apple.com/technotes/tn2005/tn2140.html
11 // http://developer.apple.com/qa/qa2005/qa1443.html
12 // http://developer.apple.com/documentation/QuickTime/Conceptual/QT7UpdateGuide/Chapter03/chapter_3_section_1.html#//apple_ref/doc/c_ref/NewMovieFromProperties
13 // http://developer.apple.com/qa/qa2001/qa1149.html
14 // http://developer.apple.com/qa/qa2001/qa1262.html
15
16 #include "com_jogamp_openmax_OMXInstance.h"
17 #include "omx_tool.h"
18 #include <stdarg.h>
19
20 static const char * const ClazzNameRuntimeException =
21                             "java/lang/RuntimeException";
22 static jclass    runtimeExceptionClz=NULL;
23 #ifdef _WIN32_WCE
24     #define STDOUT_FILE "\\Storage Card\\javafx_demos\\stdout.txt"
25     #define STDERR_FILE "\\Storage Card\\javafx_demos\\stderr.txt"
26 #endif
27
28 static void _initStatics(JNIEnv *env)
29 {
30     jclass c;
31 #ifdef _WIN32_WCE
32     _wfreopen(TEXT(STDOUT_FILE),L"w",stdout);
33     _wfreopen(TEXT(STDERR_FILE),L"w",stderr);
34 #endif
35     fprintf(stdout, "_initstatics ..\n"); fflush(stdout); // JAU
36     if (runtimeExceptionClz != NULL) {
37         return;
38     }
39
40     c = (*env)->FindClass(env, ClazzNameRuntimeException);
41     if(NULL==c) {
42         fprintf(stdout, "FatalError: can't find %s\n", ClazzNameRuntimeException);
43         (*env)->FatalError(env, ClazzNameRuntimeException);
44     }
45     runtimeExceptionClz = (jclass)(*env)->NewGlobalRef(env, c);
46     if(NULL==runtimeExceptionClz) {
47         fprintf(stdout, "FatalError: can't use %s\n", ClazzNameRuntimeException);
48         (*env)->FatalError(env, ClazzNameRuntimeException);
49     }
50 }
51
52 void java_throwNewRuntimeException(intptr_t jni_env, const char* format, ...)
53 {
54     va_list ap;
55     char buffer[255];
56     va_start(ap, format);
57     #ifdef _WIN32
58         _vsnprintf(buffer, sizeof(buffer)-1, format, ap);
59     #else
60         vsnprintf(buffer, sizeof(buffer)-1, format, ap);
61     #endif
62     va_end(ap);
63     buffer[sizeof(buffer)-1]=0;
64     fprintf(stderr, "RuntimeException: %s\n", buffer); fflush(stderr);
65     if(jni_env!=0) {
66         (*((JNIEnv *)jni_env))->ThrowNew((JNIEnv *)jni_env, runtimeExceptionClz, buffer);
67     }
68 }
69
70 void OMXInstance_SaveJavaAttributes(OMXToolBasicAV_t *pOMXAV, KDboolean issueJavaCallback)
71 {
72     if(NULL==pOMXAV || 0==pOMXAV->jni_env || 0==pOMXAV->jni_instance) {
73         fprintf(stderr, "OMXInstance_SaveJavaAttributes failed");
74         return;
75     } else if(issueJavaCallback==KD_TRUE) {
76         JNIEnv  * env = (JNIEnv *)pOMXAV->jni_env;
77         jobject instance = (jobject)pOMXAV->jni_instance;
78         (*env)->CallVoidMethod(env, instance, (jmethodID)pOMXAV->jni_mid_saveAttributes);
79     }
80 }
81
82 void OMXInstance_UpdateJavaAttributes(OMXToolBasicAV_t *pOMXAV, KDboolean issueJavaCallback)
83 {
84     if(NULL==pOMXAV || 0==pOMXAV->jni_env || 0==pOMXAV->jni_instance) {
85         fprintf(stderr, "OMXInstance_UpdateJavaAttributes failed");
86         return;
87     } else {
88         JNIEnv  * env = (JNIEnv *)pOMXAV->jni_env;
89         jobject instance = (jobject)pOMXAV->jni_instance;
90         (*env)->SetIntField(env, instance, (jfieldID)pOMXAV->jni_fid_width, (jint)pOMXAV->width);
91         (*env)->SetIntField(env, instance, (jfieldID)pOMXAV->jni_fid_height, (jint)pOMXAV->height);
92         (*env)->SetIntField(env, instance, (jfieldID)pOMXAV->jni_fid_fps, (jint)pOMXAV->framerate);
93         (*env)->SetLongField(env, instance, (jfieldID)pOMXAV->jni_fid_bps, (jlong)pOMXAV->bitrate);
94         (*env)->SetLongField(env, instance, (jfieldID)pOMXAV->jni_fid_totalFrames, (jlong)(pOMXAV->length*pOMXAV->framerate));
95         if(issueJavaCallback==KD_TRUE) {
96             (*env)->CallVoidMethod(env, instance, (jmethodID)pOMXAV->jni_mid_attributesUpdated);
97         } else {
98             if(strlen(pOMXAV->videoCodec)>0) {
99                 (*env)->SetObjectField(env, instance, (jfieldID)pOMXAV->jni_fid_vcodec, (*env)->NewStringUTF(env, pOMXAV->videoCodec));
100             }
101             if(strlen(pOMXAV->audioCodec)>0) {
102                 (*env)->SetObjectField(env, instance, (jfieldID)pOMXAV->jni_fid_acodec, (*env)->NewStringUTF(env, pOMXAV->audioCodec));
103             }
104         }
105     }
106 }
107
108 JNIEXPORT jlong JNICALL Java_com_jogamp_openmax_OMXInstance__1createInstance
109   (JNIEnv *env, jobject instance)
110 {
111     OMXToolBasicAV_t * pOMXAV;
112
113     _initStatics(env);
114
115     pOMXAV->jni_env=(intptr_t)env;
116     pOMXAV->jni_instance=(intptr_t)instance;
117
118     pOMXAV = OMXToolBasicAV_CreateInstance((intptr_t)env, (intptr_t)instance);
119     if(NULL!=pOMXAV) {
120         jclass cls = (*env)->GetObjectClass(env, instance);
121         pOMXAV->jni_mid_saveAttributes = (intptr_t) (*env)->GetMethodID(env, cls, "saveAttributes", "()V");
122         pOMXAV->jni_mid_attributesUpdated = (intptr_t) (*env)->GetMethodID(env, cls, "attributesUpdated", "()V");
123         pOMXAV->jni_fid_width = (intptr_t) (*env)->GetFieldID(env, cls, "width",  "I");
124         pOMXAV->jni_fid_height = (intptr_t) (*env)->GetFieldID(env, cls, "height",  "I");
125         pOMXAV->jni_fid_fps = (intptr_t) (*env)->GetFieldID(env, cls, "fps",  "I");
126         pOMXAV->jni_fid_bps = (intptr_t) (*env)->GetFieldID(env, cls, "bps",  "J");
127         pOMXAV->jni_fid_totalFrames = (intptr_t) (*env)->GetFieldID(env, cls, "totalFrames",  "J");
128         pOMXAV->jni_fid_acodec = (intptr_t) (*env)->GetFieldID(env, cls, "acodec",  "Ljava/lang/String;");
129         pOMXAV->jni_fid_vcodec = (intptr_t) (*env)->GetFieldID(env, cls, "vcodec",  "Ljava/lang/String;");
130     }
131
132     return (jlong) (intptr_t) (void *)pOMXAV;
133 }
134
135 JNIEXPORT void JNICALL Java_com_jogamp_openmax_OMXInstance__1setStream
136   (JNIEnv *env, jobject instance, jlong ptr, jint vBufferNum, jstring jpath)
137 {
138     jboolean iscopy;
139     OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
140
141     fprintf(stdout, "setStream 1 ..\n"); fflush(stdout); // JAU
142     if (pOMXAV != NULL) {
143         const char *filePath = (*env)->GetStringUTFChars(env, jpath, &iscopy);
144         fprintf(stdout, "setStream 2 %s..\n", filePath); fflush(stdout); // JAU
145         pOMXAV->jni_env=(intptr_t)env;
146         pOMXAV->jni_instance=(intptr_t)instance;
147         OMXToolBasicAV_SetStream(pOMXAV, vBufferNum, filePath);
148         (*env)->ReleaseStringChars(env, jpath, (const jchar *)filePath);
149     }
150     fprintf(stdout, "setStream 3 ..\n"); fflush(stdout); // JAU
151 }
152
153 JNIEXPORT void JNICALL Java_com_jogamp_openmax_OMXInstance__1setStreamEGLImageTexture2D
154   (JNIEnv *env, jobject instance, jlong ptr, jint i, jint tex, jlong image, jlong sync)
155 {
156   OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
157   if (pOMXAV != NULL) {
158     OMXToolBasicAV_SetStreamEGLImageTexture2D( pOMXAV, i, (GLuint) tex, 
159                                          (EGLImageKHR)(intptr_t)image,
160                                          (EGLSyncKHR)(intptr_t)sync);
161   }
162 }
163
164 JNIEXPORT void JNICALL Java_com_jogamp_openmax_OMXInstance__1activateStream
165   (JNIEnv *env, jobject instance, jlong ptr)
166 {
167     OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
168
169     if (pOMXAV != NULL) {
170         OMXToolBasicAV_ActivateStream(pOMXAV);
171     }
172 }
173
174 JNIEXPORT void JNICALL Java_com_jogamp_openmax_OMXInstance__1attachVideoRenderer
175   (JNIEnv *env, jobject instance, jlong ptr)
176 {
177   OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
178   OMXToolBasicAV_AttachVideoRenderer(pOMXAV);
179 }
180
181 JNIEXPORT void JNICALL Java_com_jogamp_openmax_OMXInstance__1detachVideoRenderer
182   (JNIEnv *env, jobject instance, jlong ptr)
183 {
184   OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
185   OMXToolBasicAV_DetachVideoRenderer(pOMXAV);
186 }
187
188 JNIEXPORT void JNICALL Java_com_jogamp_openmax_OMXInstance__1setPlaySpeed
189   (JNIEnv *env, jobject instance, jlong ptr, jfloat scale)
190 {
191   OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
192   OMXToolBasicAV_SetPlaySpeed(pOMXAV, scale);
193 }
194
195 JNIEXPORT jfloat JNICALL Java_com_jogamp_openmax_OMXInstance__1play
196   (JNIEnv *env, jobject instance, jlong ptr)
197 {
198   OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
199   OMXToolBasicAV_PlayStart(pOMXAV);
200   return OMXToolBasicAV_GetCurrentPosition(pOMXAV);
201 }
202
203 JNIEXPORT jfloat JNICALL Java_com_jogamp_openmax_OMXInstance__1pause
204   (JNIEnv *env, jobject instance, jlong ptr)
205 {
206   OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
207   OMXToolBasicAV_PlayPause(pOMXAV);
208   return OMXToolBasicAV_GetCurrentPosition(pOMXAV);
209 }
210
211 JNIEXPORT jfloat JNICALL Java_com_jogamp_openmax_OMXInstance__1stop
212   (JNIEnv *env, jobject instance, jlong ptr)
213 {
214     OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
215     OMXToolBasicAV_PlayStop(pOMXAV);
216     return OMXToolBasicAV_GetCurrentPosition(pOMXAV);
217 }
218
219 JNIEXPORT jfloat JNICALL Java_com_jogamp_openmax_OMXInstance__1seek
220   (JNIEnv *env, jobject instance, jlong ptr, jfloat pos)
221 {
222     OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
223     OMXToolBasicAV_PlaySeek(pOMXAV, pos);
224     return OMXToolBasicAV_GetCurrentPosition(pOMXAV);
225 }
226
227 JNIEXPORT jint JNICALL Java_com_jogamp_openmax_OMXInstance__1getNextTextureID
228   (JNIEnv *env, jobject instance, jlong ptr)
229 {
230   jint textureID = 0xffffffff;
231   OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
232   if (pOMXAV != NULL) {
233       textureID = OMXToolBasicAV_GetNextTextureID(pOMXAV);
234   }
235   return textureID;
236 }
237
238 JNIEXPORT jfloat JNICALL Java_com_jogamp_openmax_OMXInstance__1getCurrentPosition
239   (JNIEnv *env, jobject instance, jlong ptr)
240 {
241     OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
242     return OMXToolBasicAV_GetCurrentPosition(pOMXAV);
243 }
244
245
246 JNIEXPORT void JNICALL Java_com_jogamp_openmax_OMXInstance__1destroyInstance
247   (JNIEnv *env, jobject instance, jlong ptr)
248 {
249   OMXToolBasicAV_t *pOMXAV = (OMXToolBasicAV_t *)((void *)((intptr_t)ptr));
250   if (pOMXAV != NULL) {
251     OMXToolBasicAV_DestroyInstance(pOMXAV);
252   }
253 }
254
255
http://JogAmp.org git info: FAQ, tutorial and man pages.