Invalid memory acccess on texture applying issue

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Invalid memory acccess on texture applying issue

netzz
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.
Reply | Threaded
Open this post in threaded view
|

Re: Invalid memory acccess on texture applying issue

gouessej
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