Add explicit release for FrameReader/FrameWriter.
authorMichael Zucchi <michael@swordfish.com.au>
Mon, 24 Jun 2019 04:36:27 +0000 (14:06 +0930)
committerMichael Zucchi <michael@swordfish.com.au>
Mon, 24 Jun 2019 04:36:27 +0000 (14:06 +0930)
Add AVFrame ref/unref operations.

src/notzed.jjmpeg.awt/classes/au/notzed/jjmpeg/awt/JavaPixelReader.java
src/notzed.jjmpeg.fx/classes/au/notzed/jjmpeg/fx/FXPixelReader.java
src/notzed.jjmpeg/classes/au/notzed/jjmpeg/AVFrame.java
src/notzed.jjmpeg/classes/au/notzed/jjmpeg/AVPixelReader.java
src/notzed.jjmpeg/classes/au/notzed/jjmpeg/io/JJMediaReader.java
src/notzed.jjmpeg/jni/jj-avframe.c
src/notzed.jjmpeg/jni/jj-avframe.def

index 8c60c9f..0f7c470 100644 (file)
@@ -105,4 +105,10 @@ public class JavaPixelReader implements AVPixelReader {
        public void getPixels(int y, int h, int fmt, int[] buffer, int offset, int scanlineStride) {
                reader.getPixels(y, h, fmt, buffer, offset, scanlineStride);
        }
+
+       @Override
+       public void release() {
+               reader.release();
+       }
+
 }
index 957c08a..dddf359 100644 (file)
@@ -105,4 +105,9 @@ public class FXPixelReader implements PixelReader, AVPixelReader {
        public void getPixels(int y, int h, int fmt, int[] buffer, int offset, int scanlineStride) {
                reader.getPixels(y, h, fmt, buffer, offset, scanlineStride);
        }
+
+       @Override
+       public void release() {
+               reader.release();
+       }
 }
index 05b9026..3a8ad2d 100644 (file)
@@ -45,6 +45,20 @@ public class AVFrame extends AVObject {
 
        public native void copyProperties(AVFrame source);
 
+       /**
+        * Call av_frame_ref() to copy the contents. this must be newly
+        * allocated or unreffed.
+        *
+        * @param source
+        */
+       public native void ref(AVFrame source);
+
+       /**
+        * Call av_frame_unref() to clear allocated data. This does not free
+        * the AVFrame itself.
+        */
+       public native void unref();
+
        /*
         * Data stuff.
         * <p>
index f7578da..fcfa91a 100644 (file)
@@ -47,4 +47,5 @@ public interface AVPixelReader {
 
        public void getPixels(int y, int h, int fmt, int[] buffer, int offset, int scanlineStride);
 
+       public void release();
 }
index b2678bc..489657a 100644 (file)
@@ -425,6 +425,10 @@ public class JJMediaReader implements AutoCloseable {
                        return codec;
                }
 
+               public AVCodecContext getContext() {
+                       return c;
+               }
+
                /**
                 * Retrieve duration of sequence, in milliseconds.
                 *
index bf79809..d2eb767 100644 (file)
@@ -206,6 +206,7 @@ JNIEXPORT jobject JNICALL Java_au_notzed_jjmpeg_AVFrame_alloc__IIJI
 }
 
 /* **************************************** */
+// ?useful?
 JNIEXPORT void JNICALL Java_au_notzed_jjmpeg_AVFrame_copy
 (JNIEnv *env, jobject jdst, jobject jsrc) {
        AVFrame *dst = NativeZ_getP(env, jdst);
@@ -213,11 +214,11 @@ JNIEXPORT void JNICALL Java_au_notzed_jjmpeg_AVFrame_copy
        int res;
 
        res = DLCALL(av_frame_copy)(dst, src);
-       // FIXME: this is not an i/o error
        if (res < 0)
-               jjthrowAVIOException(env, res, "Frame copy failed");
+               nativez_ThrowOutOfMemoryError(env, "Copy frame");
 }
 
+// ?useful?
 JNIEXPORT void JNICALL Java_au_notzed_jjmpeg_AVFrame_copyProperties
 (JNIEnv *env, jobject jdst, jobject jsrc) {
        AVFrame *dst = NativeZ_getP(env, jdst);
@@ -225,11 +226,27 @@ JNIEXPORT void JNICALL Java_au_notzed_jjmpeg_AVFrame_copyProperties
        int res;
 
        res = DLCALL(av_frame_copy_props)(dst, src);
-       // FIXME: this is not an i/o error
        if (res < 0)
-               jjthrowAVIOException(env, res, "Frame properties copy failed");
+               nativez_ThrowOutOfMemoryError(env, "Copy frame");
 }
 
+JNIEXPORT void JNICALL Java_au_notzed_jjmpeg_AVFrame_ref
+(JNIEnv *env, jobject jdst, jobject jsrc) {
+       AVFrame *dst = NativeZ_getP(env, jdst);
+       AVFrame *src = NativeZ_getP(env, jsrc);
+       int res;
+
+       res = DLCALL(av_frame_ref)(dst, src);
+       if (res < 0)
+               nativez_ThrowOutOfMemoryError(env, "Copy frame");
+}
+
+JNIEXPORT void JNICALL Java_au_notzed_jjmpeg_AVFrame_unref
+(JNIEnv *env, jobject jo) {
+       AVFrame *frame = NativeZ_getP(env, jo);
+
+       DLCALL(av_frame_unref)(frame);
+}
 
 /* ********************************************************************** */
 /* FrameReader */
index f7fc80b..a409b7e 100644 (file)
@@ -4,6 +4,9 @@ header avutil libavutil/frame.h {
        av_frame_copy_props
        av_frame_copy
 
+       av_frame_ref
+       av_frame_unref
+
        av_frame_get_buffer
 }