From: Derk-Jan Hartman Date: Wed, 3 Sep 2008 12:11:30 +0000 (+0200) Subject: qtcapture: better retrieval for picture sizes. X-Git-Tag: 1.0.0-pre1~3395 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=434acb18e8f0ebee6b6dca53894d01fe4de8c8a5;p=vlc qtcapture: better retrieval for picture sizes. - Hopefully also fixes PAR and usage of older iSights (different fourcc) - Note that the iSight reports itself as a 320x240 (NOT 640x480) device by default. (cherry picked from commit ef585031b4c58db3cc333a96c6cbb6c07d85f8b5) --- diff --git a/modules/access/qtcapture.m b/modules/access/qtcapture.m index e4f190b014..b1fbdd3705 100644 --- a/modules/access/qtcapture.m +++ b/modules/access/qtcapture.m @@ -171,6 +171,7 @@ static int qtchroma_to_fourcc( int i_qt ) { /* Raw data types */ { k422YpCbCr8CodecType, VLC_FOURCC('U','Y','V','Y') }, + { kComponentVideoCodecType,VLC_FOURCC('Y','U','Y','2') }, { 0, 0 } }; int i; @@ -215,8 +216,6 @@ static int Open( vlc_object_t *p_this ) memset( p_sys, 0, sizeof( demux_sys_t ) ); memset( &fmt, 0, sizeof( es_format_t ) ); - msg_Dbg( p_demux, "QTCapture Probed" ); - QTCaptureDeviceInput * input = nil; NSError *o_returnedError; @@ -252,10 +251,51 @@ static int Open( vlc_object_t *p_this ) p_sys->output = [[VLCDecompressedVideoOutput alloc] init]; - /* Hack - This will lower CPU consumption for some reason */ + /* Get the formats */ + NSArray *format_array = [p_sys->device formatDescriptions]; + QTFormatDescription* camera_format = NULL; + for( int k=0; k < [format_array count]; k++ ) + { + camera_format = [format_array objectAtIndex: k]; + + NSLog( [camera_format localizedFormatSummary] ); + NSLog( [[camera_format formatDescriptionAttributes] description] ); + } + if( [format_array count] ) + camera_format = [format_array objectAtIndex: 0]; + else goto error; + + int qtchroma = [camera_format formatType]; + int chroma = qtchroma_to_fourcc( qtchroma ); + if( !chroma ) + { + msg_Err( p_demux, "Unknown qt chroma %4.4s provided by camera", (char*)&qtchroma ); + goto error; + } + + /* Now we can init */ + es_format_Init( &fmt, VIDEO_ES, chroma ); + + NSSize encoded_size = [[camera_format attributeForKey:QTFormatDescriptionVideoEncodedPixelsSizeAttribute] sizeValue]; + NSSize display_size = [[camera_format attributeForKey:QTFormatDescriptionVideoCleanApertureDisplaySizeAttribute] sizeValue]; + NSSize par_size = [[camera_format attributeForKey:QTFormatDescriptionVideoProductionApertureDisplaySizeAttribute] sizeValue]; + + fmt.video.i_width = p_sys->width = encoded_size.width; + fmt.video.i_height = p_sys->height = encoded_size.height; + if( par_size.width != encoded_size.width ) + { + fmt.video.i_aspect = par_size.width * VOUT_ASPECT_FACTOR / encoded_size.width ; + } + + NSLog( @"encoded_size %d %d", (int)encoded_size.width, (int)encoded_size.height ); + NSLog( @"display_size %d %d", (int)display_size.width, (int)display_size.height ); + NSLog( @"PAR size %d %d", (int)par_size.width, (int)par_size.height ); + [p_sys->output setPixelBufferAttributes: [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInt:480], kCVPixelBufferHeightKey, - [NSNumber numberWithInt:640], kCVPixelBufferWidthKey, nil]]; + [NSNumber numberWithInt: p_sys->height], kCVPixelBufferHeightKey, + [NSNumber numberWithInt: p_sys->width], kCVPixelBufferWidthKey, + [NSNumber numberWithBool:YES], (id)kCVPixelBufferOpenGLCompatibilityKey, + nil]]; p_sys->session = [[QTCaptureSession alloc] init]; @@ -275,23 +315,6 @@ static int Open( vlc_object_t *p_this ) [p_sys->session startRunning]; - - int qtchroma = [[[p_sys->device formatDescriptions] objectAtIndex: 0] formatType]; /* FIXME */ - int chroma = qtchroma_to_fourcc( qtchroma ); - if( !chroma ) - { - msg_Err( p_demux, "Unknown qt chroma %4.4s provided by camera", (char*)&qtchroma ); - goto error; - } - - /* Now we can init */ - - es_format_Init( &fmt, VIDEO_ES, chroma ); - - NSSize size = [[p_sys->device attributeForKey:QTFormatDescriptionVideoEncodedPixelsSizeAttribute] sizeValue]; - p_sys->width = fmt.video.i_width = 640;/* size.width; FIXME */ - p_sys->height = fmt.video.i_height = 480;/* size.height; FIXME */ - msg_Dbg( p_demux, "added new video es %4.4s %dx%d", (char*)&fmt.i_codec, fmt.video.i_width, fmt.video.i_height );