Commit ae9c402f authored by Laurent Aimar's avatar Laurent Aimar

Use vout_GetSnapshot in libvlc (untested).

parent 773363e0
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <vlc_vout.h> #include <vlc_vout.h>
#include <vlc_osd.h> #include <vlc_osd.h>
#include <vlc_block.h>
#include <stdlib.h> /* malloc(), free() */ #include <stdlib.h> /* malloc(), free() */
#include <string.h> #include <string.h>
...@@ -39,6 +40,7 @@ ...@@ -39,6 +40,7 @@
#include <errno.h> /* ENOMEM */ #include <errno.h> /* ENOMEM */
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include "../video_output/vout_control.h"
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
# include <unistd.h> # include <unistd.h>
...@@ -58,83 +60,54 @@ mediacontrol_snapshot( mediacontrol_Instance *self, ...@@ -58,83 +60,54 @@ mediacontrol_snapshot( mediacontrol_Instance *self,
(void)a_position; (void)a_position;
vout_thread_t* p_vout; vout_thread_t* p_vout;
input_thread_t *p_input; input_thread_t *p_input;
mediacontrol_RGBPicture *p_pic = NULL; mediacontrol_RGBPicture *p_pic;
char path[256];
snapshot_t *p_snapshot;
libvlc_exception_t ex; libvlc_exception_t ex;
libvlc_exception_init( &ex ); libvlc_exception_init( &ex );
mediacontrol_exception_init( exception ); mediacontrol_exception_init( exception );
p_snapshot = malloc( sizeof( snapshot_t ) );
if( ! p_snapshot )
{
RAISE_NULL( mediacontrol_InternalException, "Cannot allocate snapshot" );
}
p_input = libvlc_get_input_thread( self->p_media_player, &ex ); p_input = libvlc_get_input_thread( self->p_media_player, &ex );
if( ! p_input ) if( ! p_input )
{ {
RAISE_NULL( mediacontrol_InternalException, "No input" ); RAISE_NULL( mediacontrol_InternalException, "No input" );
} }
p_vout = vlc_object_find( p_input, VLC_OBJECT_VOUT, FIND_CHILD ); p_vout = input_GetVout( p_input );
vlc_object_release( p_input ); vlc_object_release( p_input );
if( ! p_vout ) if( ! p_vout )
{ {
RAISE_NULL( mediacontrol_InternalException, "No video output" ); RAISE_NULL( mediacontrol_InternalException, "No video output" );
} }
snprintf( path, 255, "object:%p", p_snapshot ); block_t *p_image;
var_SetString( p_vout, "snapshot-path", path ); video_format_t fmt;
var_SetString( p_vout, "snapshot-format", "png" );
vlc_mutex_init( &p_snapshot->p_mutex );
vlc_cond_init( &p_snapshot->p_condvar );
vlc_mutex_lock( &p_snapshot->p_mutex );
mutex_cleanup_push( &p_snapshot->p_mutex );
/* Use p_snapshot address as sentinel against spurious vlc_object_wait wakeups.
If a legitimate wakeup occurs, then p_snapshot->p_data will hold either if( vout_GetSnapshot( p_vout, &p_image, NULL, &fmt, "png", 500*1000 ) )
NULL (in case of error) or a pointer to valid data. */
p_snapshot->p_data = ( char* )p_snapshot;
var_TriggerCallback( p_vout, "video-snapshot" );
while ( p_snapshot->p_data == ( char* )p_snapshot )
{ {
vlc_cond_wait( &p_snapshot->p_condvar, &p_snapshot->p_mutex ); RAISE_NULL( mediacontrol_InternalException, "Snapshot exception" );
return NULL;
} }
vlc_cleanup_pop();
vlc_object_release( p_vout );
vlc_mutex_unlock( &p_snapshot->p_mutex ); /* */
vlc_cond_destroy( &p_snapshot->p_condvar ); char *p_data = malloc( p_image->i_buffer );
vlc_mutex_destroy( &p_snapshot->p_mutex ); if( p_data )
if( p_snapshot->p_data )
{ {
/* Note: p_snapshot->p_data is directly used, not copied. Thus memcpy( p_data, p_image->p_buffer, p_image->i_buffer );
do not free it here. */ p_pic = private_mediacontrol_createRGBPicture( fmt.i_width,
p_pic = private_mediacontrol_createRGBPicture( p_snapshot->i_width, fmt.i_height,
p_snapshot->i_height, fmt.i_chroma,
VLC_FOURCC( 'p','n','g',' ' ), p_image->i_pts,
p_snapshot->date, p_data,
p_snapshot->p_data, p_image->i_buffer );
p_snapshot->i_datasize );
if( !p_pic )
{
free( p_snapshot );
RAISE_NULL( mediacontrol_InternalException, "Out of memory" );
}
} }
else else
{ {
RAISE_NULL( mediacontrol_InternalException, "Snapshot exception" ); p_pic = NULL;
} }
block_Release( p_image );
if( !p_pic )
RAISE_NULL( mediacontrol_InternalException, "Out of memory" );
return p_pic; return p_pic;
} }
...@@ -175,7 +148,7 @@ mediacontrol_display_text( mediacontrol_Instance *self, ...@@ -175,7 +148,7 @@ mediacontrol_display_text( mediacontrol_Instance *self,
{ {
RAISE_VOID( mediacontrol_InternalException, "No input" ); RAISE_VOID( mediacontrol_InternalException, "No input" );
} }
p_vout = vlc_object_find( p_input, VLC_OBJECT_VOUT, FIND_CHILD ); p_vout = input_GetVout( p_input );
if( ! p_vout ) if( ! p_vout )
{ {
RAISE_VOID( mediacontrol_InternalException, "No video output" ); RAISE_VOID( mediacontrol_InternalException, "No video output" );
......
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