- var_Get( p_vout, "snapshot-path", &val );
- if( val.psz_string && !*val.psz_string )
- {
- free( val.psz_string );
- val.psz_string = 0;
- }
-
- /* Embedded snapshot : if snapshot-path == object:object-id, then
- create a snapshot_t* and store it in
- object(object-id)->p_private, then unlock and signal the
- waiting object.
- */
- if( val.psz_string && !strncmp( val.psz_string, "object:", 7 ) )
- {
- int i_id;
- vlc_object_t* p_dest;
- block_t *p_block;
- snapshot_t *p_snapshot;
- int i_size;
-
- /* Destination object-id is following object: */
- i_id = atoi( &val.psz_string[7] );
- p_dest = ( vlc_object_t* )vlc_current_object( i_id );
- if( !p_dest )
- {
- msg_Err( p_vout, "Cannot find calling object" );
- image_HandlerDelete( p_image );
- return VLC_EGENERIC;
- }
- /* Object must be locked. We will unlock it once we get the
- snapshot and written it to p_private */
- p_dest->p_private = NULL;
-
- /* Save the snapshot to a memory zone */
- fmt_in = p_vout->fmt_in;
- fmt_out.i_sar_num = fmt_out.i_sar_den = 1;
- fmt_out.i_width = var_GetInteger( p_vout, "snapshot-width" );
- fmt_out.i_height = var_GetInteger( p_vout, "snapshot-height" );
- fmt_out.i_chroma = VLC_FOURCC( 'p','n','g',' ' );
-
- p_block = ( block_t* ) image_Write( p_image, p_pic, &fmt_in, &fmt_out );
- if( !p_block )
- {
- msg_Err( p_vout, "Could not get snapshot" );
- image_HandlerDelete( p_image );
- vlc_cond_signal( &p_dest->object_wait );
- vlc_object_release( p_dest );
- return VLC_EGENERIC;
- }
-
- /* Copy the p_block data to a snapshot structure */
- /* FIXME: get the timestamp */
- p_snapshot = ( snapshot_t* ) malloc( sizeof( snapshot_t ) );
- if( !p_snapshot )
- {
- block_Release( p_block );
- image_HandlerDelete( p_image );
- vlc_cond_signal( &p_dest->object_wait );
- vlc_object_release( p_dest );
- return VLC_ENOMEM;
- }