Hi,
I guess it's BGR because JNA creates ByteBuffer using native byte
order and incoming video buffers are big endian. Which also means that
my patch probably wouldn't work on big endian. This might work (I
haven't tested on big endian), alternatively you could set ByteBuffer
order to big endian in VideoHandoffListener:
--- src/gstreamer-java/src/org/gstreamer/elements/RGBDataSink.java
(revision 424)
+++ src/gstreamer-java/src/org/gstreamer/elements/RGBDataSink.java
(working copy)
@@ -18,6 +18,7 @@
package org.gstreamer.elements;
+import java.nio.ByteOrder;
import java.nio.IntBuffer;
import org.gstreamer.Bin;
@@ -60,7 +61,16 @@
//
Element conv = ElementFactory.make("ffmpegcolorspace",
"ColorConverter");
Element videofilter = ElementFactory.make("capsfilter",
"ColorFilter");
- videofilter.setCaps(new Caps("video/x-raw-rgb, bpp=32,
depth=24"));
+ // JNA creates ByteBuffer using native byte order, set masks
according to that.
+ if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
+ videofilter.setCaps(new Caps("video/x-raw-rgb, bpp=32,
depth=24, endianness=(int)4321," +
+ " red_mask=(int)0xFF00, green_mask=(int)0xFF0000,
blue_mask=(int)0xFF000000"));
+ }
+ else {
+ videofilter.setCaps(new Caps("video/x-raw-rgb, bpp=32,
depth=24, endianness=(int)4321," +
+ " red_mask=(int)0xFF0000, green_mask=(int)0xFF00,
blue_mask=(int)0xFF"));
+ }
+
addMany(conv, videofilter, videosink);
Element.linkMany(conv, videofilter, videosink);