Hi!
I have an application, that should render movie to the texture or textures. For that purpose I use GStreamer library for deconding video and JOGL for render. Sometimes application crashes with message: Invalid memory access of location 0x4b356010 eip=0x1d44c13f Usually it occures on routine movie playing (applying frame byte buffer to texture), sometimes on creating texture. There is an OS report: OS Version: Mac OS X 10.6.4 (10F569) Report Version: 6 Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_INVALID_ADDRESS at 0x00000000432cc8e0 Crashed Thread: 18 Java: AWT-EventQueue-0 Current thread (00000000040aa400): JavaThread "AWT-EventQueue-0" [_thread_in_native, id=-1323114496, stack(00000000b112e000,00000000b122e000)] Stack: [00000000b112e000,00000000b122e000] Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) J com.jogamp.opengl.impl.gl4.GL4bcImpl.dispatch_glTexSubImage2D1(IIIIIIIILjava/lang/Object;IZJ)V J com.jogamp.opengl.impl.gl4.GL4bcImpl.glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V J Renderer.display(Ljavax/media/opengl/GLAutoDrawable;)V J com.jogamp.opengl.impl.GLDrawableHelper.display(Ljavax/media/opengl/GLAutoDrawable;)V Thread 18 Crashed: Java: AWT-EventQueue-0 0 ??? 0x1ce6413f 0 + 484852031 1 libGLImage.dylib 0x0794c939 glgProcessPixelsWithProcessor + 3963 2 com.apple.GeForceGLDriver 0x8f152f89 gldModifyTexSubImage + 3769 3 GLEngine 0x1ba15a83 glTexSubImage2D_Exec + 950 4 libGL.dylib 0x07a0e570 glTexSubImage2D + 87 5 libjogl_desktop.jnilib 0x158a061c Java_com_jogamp_opengl_impl_gl4_GL4bcImpl_dispatch_1glTexSubImage2D1__IIIIIIIILjava_lang_Object_2IZJ + 260 6 ??? 0x08a41134 0 + 144970036 7 ??? 0x08a418c0 0 + 144971968 8 ??? 0x0894a90c 0 + 143960332 9 ??? 0x08a4084c 0 + 144967756 10 ??? 0x08803db1 0 + 142622129 11 ??? 0x0880428d 0 + 142623373 12 ??? 0x08803db1 0 + 142622129 13 ??? 0x0880428d 0 + 142623373 14 ??? 0x08a29518 0 + 144872728 15 ??? 0x089db870 0 + 144554096 16 ??? 0x08803fdd 0 + 142622685 17 ??? 0x08803db1 0 + 142622129 18 ??? 0x08803db1 0 + 142622129 19 ??? 0x08803db1 0 + 142622129 20 ??? 0x08803db1 0 + 142622129 21 ??? 0x088012d3 0 + 142611155 22 libclient.dylib 0x028a3500 JVM_Lseek + 139952 23 libclient.dylib 0x028a32a6 JVM_Lseek + 139350 24 libclient.dylib 0x028b4f3b JVM_InternString + 2123 25 libclient.dylib 0x028b4daa JVM_InternString + 1722 26 libclient.dylib 0x028b4b94 JVM_InternString + 1188 27 libclient.dylib 0x028b462f JVM_StartThread + 2239 28 libclient.dylib 0x0280f38b JNI_CreateJavaVM_Impl + 55547 29 libSystem.B.dylib 0x0064681d _pthread_start + 345 30 libSystem.B.dylib 0x006466a2 thread_start + 34 So, error happens in glTexSubImage2D, and down there is code sample where this function is in use. Also, crash happens always when layers > 1, and byteBuffer 100% cannot be modified from other thread. But it looks like concurrency problem. synchronized public void display(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); ....... // Rotating layers for (Layer l: layers) { Player player=l.getPlayer(); if (player!=null) { Texture texture=player.getTexture(); ToGlSink.GlAtom atom=player.getGsSink().getGlAtom(); if (atom!=null) { if (texture == null) { atom.byteBuffer.rewind(); System.out.println("creating texture"); texture = TextureIO.newTexture(new TextureData (null, GL2.GL_RGBA16,atom.width, atom.height, 0, GL2.GL_BGRA, GL2.GL_UNSIGNED_INT_8_8_8_8_REV, false, false, true, atom.byteBuffer, null)); texture.enable(); } else { texture.bind(); atom.byteBuffer.rewind(); // Crash happens here gl.glTexSubImage2D(texture.getTarget(), 0, 0, 0, atom.width, atom.height, GL2.GL_BGRA, GL2.GL_UNSIGNED_INT_8_8_8_8_REV, atom.byteBuffer); } } } } } Any help would be appreciated. |
Administrator
|
Hi!
Don't modify the byte buffer outside the EDT or at least avoid relative access. atom.byteBuffer.rewind() should not be necessary, why do you call this? Maybe use jmcvideo instead of gstreamer, it is more cross-platform.
Julien Gouesse | Personal blog | Website
|
Free forum by Nabble | Edit this page |