Commit 3e461d28 authored by Pierre d'Herbemont's avatar Pierre d'Herbemont

qtcapture: Tab fixes, plus attempt to get the real PTS. We still really do lag...

qtcapture: Tab fixes, plus attempt to get the real PTS. We still really do lag compared to PhotoBooth...
parent 90d9d6dd
...@@ -65,7 +65,8 @@ vlc_module_end(); ...@@ -65,7 +65,8 @@ vlc_module_end();
*****************************************************************************/ *****************************************************************************/
@interface VLCDecompressedVideoOutput : QTCaptureDecompressedVideoOutput @interface VLCDecompressedVideoOutput : QTCaptureDecompressedVideoOutput
{ {
CVImageBufferRef currentImageBuffer; CVImageBufferRef currentImageBuffer;
mtime_t currentPts;
} }
- (id)init; - (id)init;
- (void)outputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection; - (void)outputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection;
...@@ -76,53 +77,57 @@ vlc_module_end(); ...@@ -76,53 +77,57 @@ vlc_module_end();
@implementation VLCDecompressedVideoOutput : QTCaptureDecompressedVideoOutput @implementation VLCDecompressedVideoOutput : QTCaptureDecompressedVideoOutput
- (id)init - (id)init
{ {
if( self = [super init] ) if( self = [super init] )
{ {
currentImageBuffer = nil; currentImageBuffer = nil;
} currentPts = 0;
return self; }
return self;
} }
- (void)dealloc - (void)dealloc
{ {
@synchronized (self) { @synchronized (self) {
CVBufferRelease(currentImageBuffer); CVBufferRelease(currentImageBuffer);
currentImageBuffer = nil; currentImageBuffer = nil;
} }
[super dealloc]; [super dealloc];
} }
- (void)outputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection - (void)outputVideoFrame:(CVImageBufferRef)videoFrame withSampleBuffer:(QTSampleBuffer *)sampleBuffer fromConnection:(QTCaptureConnection *)connection
{ {
// Store the latest frame // Store the latest frame
// This must be done in a @synchronized block because this delegate method is not called on the main thread // This must be done in a @synchronized block because this delegate method is not called on the main thread
CVImageBufferRef imageBufferToRelease; CVImageBufferRef imageBufferToRelease;
CVBufferRetain(videoFrame); CVBufferRetain(videoFrame);
@synchronized (self) { @synchronized (self) {
imageBufferToRelease = currentImageBuffer; imageBufferToRelease = currentImageBuffer;
currentImageBuffer = videoFrame; currentImageBuffer = videoFrame;
} /* FIXME: is it the right PTS? */
CVBufferRelease(imageBufferToRelease); currentPts = [sampleBuffer presentationTime].timeValue * 1000;
}
CVBufferRelease(imageBufferToRelease);
} }
- (BOOL)copyCurrentFrameToBuffer:(void *)buffer - (mtime_t)copyCurrentFrameToBuffer:(void *)buffer
{ {
CVImageBufferRef imageBuffer; CVImageBufferRef imageBuffer;
mtime_t pts;
@synchronized (self) { @synchronized (self) {
if(!currentImageBuffer) return NO; if(!currentImageBuffer) return 0;
imageBuffer = CVBufferRetain(currentImageBuffer); imageBuffer = CVBufferRetain(currentImageBuffer);
} pts = currentPts;
}
CVPixelBufferLockBaseAddress(imageBuffer, 0); CVPixelBufferLockBaseAddress(imageBuffer, 0);
void * pixels = CVPixelBufferGetBaseAddress(imageBuffer); void * pixels = CVPixelBufferGetBaseAddress(imageBuffer);
memcpy( buffer, pixels, CVPixelBufferGetBytesPerRow(imageBuffer) * CVPixelBufferGetHeight(imageBuffer) ); memcpy( buffer, pixels, CVPixelBufferGetBytesPerRow(imageBuffer) * CVPixelBufferGetHeight(imageBuffer) );
CVPixelBufferUnlockBaseAddress(imageBuffer, 0); CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
CVBufferRelease(imageBuffer); CVBufferRelease(imageBuffer);
return YES; return currentPts;
} }
@end @end
...@@ -315,7 +320,9 @@ static int Demux( demux_t *p_demux ) ...@@ -315,7 +320,9 @@ static int Demux( demux_t *p_demux )
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
if( ![p_sys->output copyCurrentFrameToBuffer: p_block->p_buffer] ) p_block->i_pts = [p_sys->output copyCurrentFrameToBuffer: p_block->p_buffer];
if( !p_block->i_pts )
{ {
/* Nothing to display yet, just forget */ /* Nothing to display yet, just forget */
block_Release( p_block ); block_Release( p_block );
...@@ -323,7 +330,7 @@ static int Demux( demux_t *p_demux ) ...@@ -323,7 +330,7 @@ static int Demux( demux_t *p_demux )
return 1; return 1;
} }
p_block->i_pts = mdate(); /* FIXME */ p_block->i_pts += mdate();
es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts ); es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts );
es_out_Send( p_demux->out, p_sys->p_es_video, p_block ); es_out_Send( p_demux->out, p_sys->p_es_video, p_block );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment