From 0adae885e5917d4621b0a9280d95c180b6c1a01d Mon Sep 17 00:00:00 2001 From: Lyubomir Marinov Date: Thu, 14 Jan 2010 10:28:52 +0000 Subject: [PATCH] Attempts to fix the QTKit CaptureDevice on Mac OS X Leopard which does not seem to report the size of the video it is going to output. --- lib/native/mac/libjquicktime.jnilib | Bin 95456 -> 89632 bytes ...or_impl_neomedia_quicktime_CVPixelBuffer.h | 16 ++++ ...or_impl_neomedia_quicktime_CVPixelBuffer.m | 14 +++ .../protocol/quicktime/QuickTimeStream.java | 90 +++++++++++++++++- .../neomedia/quicktime/CVPixelBuffer.java | 42 ++++++++ 5 files changed, 158 insertions(+), 4 deletions(-) diff --git a/lib/native/mac/libjquicktime.jnilib b/lib/native/mac/libjquicktime.jnilib index 14d355bf3c6597294f0c8a1ad4e3d9cedd5cffcf..fbdea623fa9ef6a177f21da13c075965d5c1bbd5 100755 GIT binary patch literal 89632 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 literal 95456 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 of {@link #data} if known. If possible, determined by + * the CVPixelBuffer video frame from which data is + * acquired. + */ + private Format dataFormat; + /** * The Object which synchronizes the access to the * {@link #data}-related fields of this instance. @@ -121,13 +128,17 @@ private void captureOutputDidOutputVideoFrameWithSampleBuffer( CVImageBuffer videoFrame, QTSampleBuffer sampleBuffer) { + CVPixelBuffer pixelBuffer = (CVPixelBuffer) videoFrame; boolean transferData; synchronized (dataSyncRoot) { - data = ((CVPixelBuffer) videoFrame).getBytes(); + data = pixelBuffer.getBytes(); dataTimeStamp = System.nanoTime(); transferData = (data != null); + + if (dataFormat == null) + dataFormat = getVideoFrameFormat(pixelBuffer); } if (transferData) @@ -167,9 +178,34 @@ public void close() @Override protected Format doGetFormat() { - if (format == null) + Format format; + + if (this.format == null) + { format = getCaptureOutputFormat(); - return (format == null) ? super.doGetFormat() : format; + if (format == null) + format = super.doGetFormat(); + else + { + VideoFormat videoFormat = (VideoFormat) format; + + if (videoFormat.getSize() != null) + this.format = format; + else + format + = videoFormat + .intersects( + new VideoFormat( + null, + new Dimension(640, 480), + Format.NOT_SPECIFIED, + Format.byteArray, + Format.NOT_SPECIFIED)); + } + } + else + format = this.format; + return format; } /** @@ -202,7 +238,9 @@ private Format getCaptureOutputFormat() return new RGBFormat( - new Dimension(width, height), + ((width == 0) && (height == 0) + ? null + : new Dimension(width, height)), Format.NOT_SPECIFIED, Format.byteArray, Format.NOT_SPECIFIED, @@ -214,6 +252,38 @@ private Format getCaptureOutputFormat() return null; } + /** + * Gets the Format of the media data made available by this + * PushBufferStream as indicated by a specific + * CVPixelBuffer. + * + * @param videoFrame the CVPixelBuffer which provides details about + * the Format of the media data made available by this + * PushBufferStream + * @return the Format of the media data made available by this + * PushBufferStream as indicated by the specified + * CVPixelBuffer + */ + private Format getVideoFrameFormat(CVPixelBuffer videoFrame) + { + Format format = getFormat(); + Dimension size = ((VideoFormat) format).getSize(); + + if ((size == null) || ((size.width == 0) && (size.height == 0))) + format + = format + .intersects( + new VideoFormat( + null, + new Dimension( + videoFrame.getWidth(), + videoFrame.getHeight()), + Format.NOT_SPECIFIED, + Format.byteArray, + Format.NOT_SPECIFIED)); + return format; + } + /** * Reads media data from this PushBufferStream into a specific * Buffer without blocking. @@ -235,6 +305,8 @@ public void read(Buffer buffer) buffer.setData(data); buffer .setFlags(Buffer.FLAG_LIVE_DATA | Buffer.FLAG_SYSTEM_TIME); + if (dataFormat != null) + buffer.setFormat(dataFormat); buffer.setLength(data.length); buffer.setOffset(0); buffer.setTimeStamp(dataTimeStamp); @@ -255,6 +327,15 @@ private void setCaptureOutputFormat(Format format) { VideoFormat videoFormat = (VideoFormat) format; Dimension size = videoFormat.getSize(); + + /* + * FIXME Mac OS X Leopard does not seem to report the size of the + * QTCaptureDevice in its formatDescriptions early in its creation. + * The workaround presented here is to just force a specific size. + */ + if (size == null) + size = new Dimension(640, 480); + NSMutableDictionary pixelBufferAttributes = null; if (size != null) @@ -300,6 +381,7 @@ public void stop() synchronized (dataSyncRoot) { data = null; + dataFormat = null; } } } diff --git a/src/net/java/sip/communicator/impl/neomedia/quicktime/CVPixelBuffer.java b/src/net/java/sip/communicator/impl/neomedia/quicktime/CVPixelBuffer.java index 26a6a3cf8..3e5da5cc3 100644 --- a/src/net/java/sip/communicator/impl/neomedia/quicktime/CVPixelBuffer.java +++ b/src/net/java/sip/communicator/impl/neomedia/quicktime/CVPixelBuffer.java @@ -48,4 +48,46 @@ public byte[] getBytes() * specified CoreVideo CVPixelBufferRef */ private static native byte[] getBytes(long ptr); + + /** + * Gets the height in pixels of this CVPixelBuffer. + * + * @return the height in pixels of this CVPixelBuffer + */ + public int getHeight() + { + return getHeight(getPtr()); + } + + /** + * Gets the height in pixels of a specific CoreVideo + * CVPixelBufferRef. + * + * @param ptr the CoreVideo CVPixelBufferRef to get the height in + * pixels of + * @return the height in pixels of the specified CoreVideo + * CVPixelBufferRef + */ + private static native int getHeight(long ptr); + + /** + * Gets the width in pixels of this CVPixelBuffer. + * + * @return the width in pixels of this CVPixelBuffer + */ + public int getWidth() + { + return getWidth(getPtr()); + } + + /** + * Gets the width in pixels of a specific CoreVideo + * CVPixelBufferRef. + * + * @param ptr the CoreVideo CVPixelBufferRef to get the width in + * pixels of + * @return the width in pixels of the specified CoreVideo + * CVPixelBufferRef + */ + private static native int getWidth(long ptr); }