#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdbool.h>
static FILE *mplayer=NULL;
#define FIFO "fifo"
#define ERROR -1
#define SUCCESS 0
#define BUFSIZE 256
bool find_str( const char *from , const char *pat )
{
if( strlen( from ) < strlen( pat ) ){
return false;
}
if( strstr( from , pat ) != NULL ){
return true;
}else{
return false;
}
}
int send_command( char *com )
{
FILE *f = fopen( FIFO , "w" );
if( f == NULL ){
char buf[BUFSIZE];
memset( buf , 0 , BUFSIZE );
sprintf( buf , "command %s fifo open failed.\n" , com );
perror( buf );
return ERROR;
}
int r = fputs( com , f );
if( r == EOF ){
char buf[BUFSIZE];
memset( buf , 0 , BUFSIZE );
sprintf( buf , "command %s send failed.\n" , com );
perror( buf );
return ERROR;
}
fclose( f );
return SUCCESS;
}
int get_reply( char *reply , char *wait )
{
char buf[BUFSIZE];
while(true){
memset( buf , 0 , BUFSIZE );
fgets( buf , BUFSIZE , mplayer );
printf( "read line - %s ", buf );
if( find_str( buf , wait ) == true ){
strcpy( reply , buf );
break;
}
}
return SUCCESS;
}
int mplayer_start()
{
mplayer = popen("mplayer -slave -idle -quiet -input file=fifo" , "r" );
if( mplayer == NULL ){
perror("mplayer start failed\n");
return ERROR;
}else{
return SUCCESS;
}
}
int mplayer_play( char *file )
{
char buf[BUFSIZE];
memset( buf , 0 , BUFSIZE );
sprintf( buf , "loadfile %s\n" , file );
return send_command( buf );
}
int mplayer_get_time_length( double *len )
{
char *com="get_time_length\n";
int r = send_command( com );
if( r == ERROR ){
return r;
}
char buf[BUFSIZE];
char *wait = "ANS_LENGTH=";
r = get_reply( buf , wait );
*len = 0.0;
sscanf( buf , "ANS_LENGTH=%lf\n" , len );
return r;
}
int mplayer_get_time_pos( double *pos )
{
char *com="get_time_pos\n";
int r = send_command( com );
if( r == ERROR ){
return r;
}
char buf[BUFSIZE];
char *wait = "ANS_TIME_POSITION=";
r = get_reply( buf , wait );
*pos = 0.0;
sscanf( buf , "ANS_TIME_POSITION=%lf\n" , pos );
return r;
}
int mplayer_seek_relative( int sec )
{
char buf[BUFSIZE];
memset( buf , 0 , BUFSIZE );
if( sec > 0 ){
sprintf( buf , "seek +%d 0\n" , sec );
}else{
sprintf( buf , "seek %d 0\n" , sec );
}
printf( "seek command %s " , buf );
return send_command( buf );
}
int mplayer_seek_percent( double percent )
{
char buf[BUFSIZE];
memset( buf , 0 , BUFSIZE );
sprintf( buf , "seek %'.2f 1\n" , percent );
printf( "seek command %s " , buf );
return send_command( buf );
}
int mplayer_quit()
{
char *com = "q\n";
int r = send_command( com );
sleep( 3 );
if( mplayer != NULL ){
pclose( mplayer );
mplayer = NULL;
}
return r;
}
int mplayer_set_fullscreen()
{
char *com="vo_fullscreen 1\n";
return send_command( com );
}
int main( int argc , char** args )
{
mplayer_start();
sleep( 2 );
mplayer_play("sample.mp4");
sleep( 2 );
double time;
mplayer_get_time_length( &time );
sleep( 2 );
double pos;
mplayer_get_time_pos( &pos );
sleep( 2 );
mplayer_seek_percent( 50.0 );
sleep( 2 );
mplayer_seek_relative( 5 );
sleep( 2 );
mplayer_set_fullscreen();
sleep( 15 );
mplayer_quit();
return SUCCESS;
}