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
...@@ -66,6 +66,7 @@ vlc_module_end(); ...@@ -66,6 +66,7 @@ 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;
...@@ -79,6 +80,7 @@ vlc_module_end(); ...@@ -79,6 +80,7 @@ vlc_module_end();
if( self = [super init] ) if( self = [super init] )
{ {
currentImageBuffer = nil; currentImageBuffer = nil;
currentPts = 0;
} }
return self; return self;
} }
...@@ -102,17 +104,20 @@ vlc_module_end(); ...@@ -102,17 +104,20 @@ vlc_module_end();
@synchronized (self) { @synchronized (self) {
imageBufferToRelease = currentImageBuffer; imageBufferToRelease = currentImageBuffer;
currentImageBuffer = videoFrame; currentImageBuffer = videoFrame;
/* FIXME: is it the right PTS? */
currentPts = [sampleBuffer presentationTime].timeValue * 1000;
} }
CVBufferRelease(imageBufferToRelease); 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);
...@@ -122,7 +127,7 @@ vlc_module_end(); ...@@ -122,7 +127,7 @@ vlc_module_end();
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