[vlc-devel] commit: qtcapture: Use a direct block buffer, and remove a memcpy. ( Pierre d'Herbemont )

git version control git at videolan.org
Fri Jul 18 00:15:54 CEST 2008


vlc | branch: master | Pierre d'Herbemont <pdherbemont at videolan.org> | Fri Jul 18 00:17:17 2008 +0200| [b65ca27b5b5445bf4814dcbc22985cfc24f0900b]

qtcapture: Use a direct block buffer, and remove a memcpy.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b65ca27b5b5445bf4814dcbc22985cfc24f0900b
---

 modules/access/qtcapture.m |   67 +++++++++++++++++++++++++++++++------------
 1 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/modules/access/qtcapture.m b/modules/access/qtcapture.m
index bb99846..aad1326 100644
--- a/modules/access/qtcapture.m
+++ b/modules/access/qtcapture.m
@@ -47,6 +47,40 @@ static void Close( vlc_object_t *p_this );
 static int Demux( demux_t *p_demux );
 static int Control( demux_t *, int, va_list );
 
+typedef struct qtcapture_block_t
+{
+    block_t block;
+    CVImageBufferRef imageBuffer;
+    block_free_t pf_original_release;
+} qtcapture_block_t;
+
+static void qtcapture_block_release( block_t *p_block )
+{
+    qtcapture_block_t * p_qtblock = (qtcapture_block_t *)p_block;
+    CVBufferRelease(p_qtblock->imageBuffer);
+    CVPixelBufferUnlockBaseAddress(p_qtblock->imageBuffer, 0);
+    p_qtblock->pf_original_release( &p_qtblock->block );
+}
+
+static block_t * qtcapture_block_new( void * p_buffer,
+    int i_buffer,
+    CVImageBufferRef imageBufferToRelease )
+{
+    qtcapture_block_t * p_qtblock;
+
+    /* Build block */
+    p_qtblock = malloc( sizeof( qtcapture_block_t ) );
+    if(!p_qtblock) return NULL;
+
+    /* Fill all fields */
+    block_Init( &p_qtblock->block, p_buffer, i_buffer );
+    p_qtblock->block.pf_release = qtcapture_block_release;
+    p_qtblock->imageBuffer = imageBufferToRelease;
+
+    return (block_t *)p_qtblock;
+}
+
+
 /*****************************************************************************
 * Module descriptor
 *****************************************************************************/
@@ -72,7 +106,7 @@ vlc_module_end();
 }
 - (id)init;
 - (void)outputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection;
-- (mtime_t)copyCurrentFrameToBuffer:(void *)buffer;
+- (block_t *)blockWithCurrentFrame;
 @end
 
 /* Apple sample code */
@@ -111,31 +145,35 @@ vlc_module_end();
         currentImageBuffer = videoFrame;
         currentPts = 1000000L / [sampleBuffer presentationTime].timeScale * [sampleBuffer presentationTime].timeValue;
     }
+
     CVBufferRelease(imageBufferToRelease);
 }
 
-- (mtime_t)copyCurrentFrameToBuffer:(void *)buffer
+- (block_t *)blockWithCurrentFrame
 {
     CVImageBufferRef imageBuffer;
     mtime_t pts;
+    block_t * p_block = NULL;
 
     if(!currentImageBuffer || currentPts == previousPts )
-        return 0;
+        return NULL;
 
     @synchronized (self)
     {
+        // Released in the p_block release method.
         imageBuffer = CVBufferRetain(currentImageBuffer);
         pts = previousPts = currentPts;
 
+
+        // Unlocked in the p_block release method.
         CVPixelBufferLockBaseAddress(imageBuffer, 0);
         void * pixels = CVPixelBufferGetBaseAddress(imageBuffer);
-        memcpy( buffer, pixels, CVPixelBufferGetBytesPerRow(imageBuffer) * CVPixelBufferGetHeight(imageBuffer) );
-        CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
+        p_block = qtcapture_block_new( imageBuffer, CVPixelBufferGetDataSize( imageBuffer ),
+                imageBuffer );
+        p_block->i_pts = currentPts;
     }
 
-    CVBufferRelease(imageBuffer);
-
-    return currentPts;
+    return p_block;
 }
 
 @end
@@ -341,25 +379,16 @@ static int Demux( demux_t *p_demux )
     demux_sys_t *p_sys = p_demux->p_sys;
     block_t *p_block;
 
-    p_block = block_New( p_demux, p_sys->width *
-                            p_sys->height * 2 /* FIXME */ );
-    if( !p_block )
-    {
-        msg_Err( p_demux, "cannot get block" );
-        return 0;
-    }
-
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 
     @synchronized (p_sys->output)
     {
-    p_block->i_pts = [p_sys->output copyCurrentFrameToBuffer: p_block->p_buffer];
+        p_block = [p_sys->output blockWithCurrentFrame];
     }
 
-    if( !p_block->i_pts )
+    if( !p_block )
     {
         /* Nothing to display yet, just forget */
-        block_Release( p_block );
         [pool release];
         msleep( 10000 );
         return 1;




More information about the vlc-devel mailing list