⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mediacontrol-core.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    playlist_Stop( self->p_playlist );}voidmediacontrol_playlist_add_item( mediacontrol_Instance *self,                                const char * psz_file,                                mediacontrol_Exception *exception ){    exception=mediacontrol_exception_init( exception );    if( !self->p_playlist )    {        RAISE( mediacontrol_InternalException, "No playlist" );        return;    }    playlist_Add( self->p_playlist, psz_file, psz_file , PLAYLIST_REPLACE, 0 );}voidmediacontrol_playlist_clear( mediacontrol_Instance *self,                             mediacontrol_Exception *exception ){    exception=mediacontrol_exception_init( exception );    if( !self->p_playlist )    {        RAISE( mediacontrol_PlaylistException, "No playlist" );        return;    }    playlist_Clear( self->p_playlist );    return;}mediacontrol_PlaylistSeq *mediacontrol_playlist_get_list( mediacontrol_Instance *self,                                mediacontrol_Exception *exception ){    mediacontrol_PlaylistSeq *retval;    int i_index;    playlist_t * p_playlist = self->p_playlist;;    int i_playlist_size;    exception=mediacontrol_exception_init( exception );    if( !p_playlist )    {        RAISE( mediacontrol_PlaylistException, "No playlist" );        return NULL;    }    vlc_mutex_lock( &p_playlist->object_lock );    i_playlist_size = p_playlist->i_size;    retval = mediacontrol_PlaylistSeq__alloc( i_playlist_size );    for( i_index = 0 ; i_index < i_playlist_size ; i_index++ )    {        retval->data[i_index] = strdup( p_playlist->pp_items[i_index]->input.psz_uri );    }    vlc_mutex_unlock( &p_playlist->object_lock );    return retval;}mediacontrol_RGBPicture*_mediacontrol_createRGBPicture( int i_width, int i_height, long i_chroma, long long l_date,                                char* p_data, int i_datasize ){    mediacontrol_RGBPicture *retval;    retval = mediacontrol_RGBPicture__alloc( i_datasize );    if( retval )    {        retval->width  = i_width;        retval->height = i_height;        retval->type   = i_chroma;        retval->date   = l_date;        retval->size   = i_datasize;        memcpy( retval->data, p_data, i_datasize );    }    return retval;}mediacontrol_RGBPicture *mediacontrol_snapshot( mediacontrol_Instance *self,                       const mediacontrol_Position * a_position,                       mediacontrol_Exception *exception ){    mediacontrol_RGBPicture *retval = NULL;    input_thread_t* p_input = self->p_playlist->p_input;    vout_thread_t *p_vout = NULL;    int i_datasize;    snapshot_t **pointer;    vlc_value_t val;    int i_index;    snapshot_t *p_best_snapshot;    long searched_date;#ifdef HAS_SNAPSHOT    int i_cachesize;#endif    exception=mediacontrol_exception_init( exception );    /*       if( var_Get( self->p_vlc, "snapshot-id", &val ) == VLC_SUCCESS )       p_vout = vlc_object_get( self->p_vlc, val.i_int );    */    /* FIXME: if in p_libvlc, we cannot have multiple video outputs */    /* Once corrected, search for snapshot-id to modify all instances */    if( var_Get( p_input, "snapshot-id", &val ) != VLC_SUCCESS )    {        RAISE( mediacontrol_InternalException, "No snapshot-id in p_input" );        return NULL;    }    p_vout = vlc_object_get( self->p_vlc, val.i_int );    if( ! p_vout )    {        RAISE( mediacontrol_InternalException, "No snapshot module" );        return NULL;    }#ifdef HAS_SNAPSHOT    /* We test if the vout is a snapshot module. We cannot test       pvout_psz_object_name( which is NULL ). But we can check if       there are snapshot-specific variables */    if( var_Get( p_vout, "snapshot-datasize", &val ) != VLC_SUCCESS )    {        RAISE( mediacontrol_InternalException, "No snapshot module" );        vlc_object_release( p_vout );        return NULL;    }    i_datasize = val.i_int;    /* Handle the a_position parameter */    if( ! ( a_position->origin == mediacontrol_RelativePosition            && a_position->value == 0 ) )    {        /* The position is not the current one. Go to it. */        mediacontrol_set_media_position( self,                                         ( mediacontrol_Position* ) a_position,                                         exception );        if( exception->code )        {            vlc_object_release( p_vout );            return NULL;        }    }    /* FIXME: We should not go further until we got past the position       ( which means that we had the possibility to capture the right       picture ). */    vlc_mutex_lock( &p_vout->picture_lock );    searched_date = mediacontrol_position2microsecond( p_input,                                                       ( mediacontrol_Position * ) a_position );    var_Get( p_vout, "snapshot-cache-size", &val );    i_cachesize = val.i_int  ;    var_Get( p_vout, "snapshot-list-pointer", &val );    pointer = ( snapshot_t ** )val.p_address;    if( ! pointer )    {        RAISE( mediacontrol_InternalException, "No available snapshot" );        vlc_mutex_unlock( &p_vout->picture_lock );        vlc_object_release( p_vout );        return NULL;    }    /* Find the more appropriate picture, based on date */    p_best_snapshot = pointer[0];    for( i_index = 1 ; i_index < i_cachesize ; i_index++ )    {        long l_diff = pointer[i_index]->date - searched_date;        if( l_diff > 0 && l_diff < abs( p_best_snapshot->date - searched_date ))        {            /* This one is closer, and _after_ the requested position */            p_best_snapshot = pointer[i_index];        }    }    /* FIXME: add a test for the case that no picture matched the test       ( we have p_best_snapshot == pointer[0] */    retval = _mediacontrol_createRGBPicture( p_best_snapshot->i_width,                                             p_best_snapshot->i_height,                                             p_vout->output.i_chroma,                                             p_best_snapshot->date,                                             p_best_snapshot->p_data,                                             i_datasize );    vlc_mutex_unlock( &p_vout->picture_lock );    vlc_object_release( p_vout );#endif    return retval;}mediacontrol_RGBPicture **mediacontrol_all_snapshots( mediacontrol_Instance *self,                            mediacontrol_Exception *exception ){    mediacontrol_RGBPicture **retval = NULL;    vout_thread_t *p_vout = NULL;    int i_datasize;    int i_cachesize;    vlc_value_t val;    int i_index;#ifdef HAS_SNAPSHOT    snapshot_t **pointer;#endif    exception=mediacontrol_exception_init( exception );    if( var_Get( self->p_playlist->p_input, "snapshot-id", &val ) == VLC_SUCCESS )        p_vout = vlc_object_get( self->p_vlc, val.i_int );    if( ! p_vout )    {        RAISE( mediacontrol_InternalException, "No snapshot module" );        return NULL;    }#ifdef HAS_SNAPSHOT    /* We test if the vout is a snapshot module. We cannot test       pvout_psz_object_name( which is NULL ). But we can check if       there are snapshot-specific variables */    if( var_Get( p_vout, "snapshot-datasize", &val ) != VLC_SUCCESS )    {        RAISE( mediacontrol_InternalException, "No snapshot module" );        vlc_object_release( p_vout );        return NULL;    }    i_datasize = val.i_int;    vlc_mutex_lock( &p_vout->picture_lock );    var_Get( p_vout, "snapshot-cache-size", &val );    i_cachesize = val.i_int  ;    var_Get( p_vout, "snapshot-list-pointer", &val );    pointer = ( snapshot_t ** )val.p_address;    if( ! pointer )    {        RAISE( mediacontrol_InternalException, "No available picture" );        vlc_mutex_unlock( &p_vout->picture_lock );        vlc_object_release( p_vout );        return NULL;    }    retval = ( mediacontrol_RGBPicture** )malloc( (i_cachesize + 1 ) * sizeof( char* ));    for( i_index = 0 ; i_index < i_cachesize ; i_index++ )    {        snapshot_t *p_s = pointer[i_index];        mediacontrol_RGBPicture *p_rgb;        p_rgb = _mediacontrol_createRGBPicture( p_s->i_width,                                                p_s->i_height,                                                p_vout->output.i_chroma,                                                p_s->date,                                                p_s->p_data,                                                i_datasize );        retval[i_index] = p_rgb;    }    retval[i_cachesize] = NULL;    vlc_mutex_unlock( &p_vout->picture_lock );    vlc_object_release( p_vout );#endif    return retval;}voidmediacontrol_display_text( mediacontrol_Instance *self,                           const char * message,                           const mediacontrol_Position * begin,                           const mediacontrol_Position * end,                           mediacontrol_Exception *exception ){    input_thread_t *p_input = NULL;    vout_thread_t *p_vout = NULL;    p_vout = vlc_object_find( self->p_playlist, VLC_OBJECT_VOUT, FIND_CHILD );    if( ! p_vout )    {        RAISE( mediacontrol_InternalException, "No video output" );        return;    }    if( begin->origin == mediacontrol_RelativePosition &&        begin->value == 0 &&        end->origin == mediacontrol_RelativePosition )    {        mtime_t i_duration = 0;        i_duration = 1000 * mediacontrol_unit_convert( self->p_playlist->p_input,                                                       end->key,                                                       mediacontrol_MediaTime,                                                       end->value );        vout_ShowTextRelative( p_vout, DEFAULT_CHAN, ( char* ) message, NULL,                               OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 20, 20,                               i_duration );    }    else    {        mtime_t i_debut, i_fin, i_now;        p_input = self->p_playlist->p_input;        if( ! p_input )        {            RAISE( mediacontrol_InternalException, "No input" );            vlc_object_release( p_vout );            return;        }        /* FIXME */        /* i_now = input_ClockGetTS( p_input, NULL, 0 ); */        i_now = 0;                i_debut = mediacontrol_position2microsecond( p_input,                                                     ( mediacontrol_Position* ) begin );        i_debut += i_now;        i_fin = mediacontrol_position2microsecond( p_input,                                                   ( mediacontrol_Position * ) end );        i_fin += i_now;        vout_ShowTextAbsolute( p_vout, DEFAULT_CHAN, ( char* ) message, NULL,                               OSD_ALIGN_BOTTOM | OSD_ALIGN_LEFT, 20, 20,                               i_debut, i_fin );    }    vlc_object_release( p_vout );}mediacontrol_StreamInformation *mediacontrol_get_stream_information( mediacontrol_Instance *self,                                     mediacontrol_PositionKey a_key,                                     mediacontrol_Exception *exception ){    mediacontrol_StreamInformation *retval;    input_thread_t *p_input = self->p_playlist->p_input;    vlc_value_t val;    retval = ( mediacontrol_StreamInformation* )malloc( sizeof( mediacontrol_StreamInformation ) );    if( ! retval )    {        RAISE( mediacontrol_InternalException, "Out of memory" );        return NULL;    }    if( ! p_input )    {        /* No p_input defined */        retval->streamstatus = mediacontrol_UndefinedStatus;        retval->url          = strdup( "None" );        retval->position     = 0;        retval->length       = 0;    }    else    {        switch( var_GetInteger( p_input, "state" ) )        {        case PLAYING_S     :            retval->streamstatus = mediacontrol_PlayingStatus;            break;        case PAUSE_S       :            retval->streamstatus = mediacontrol_PauseStatus;            break;        case INIT_S        :            retval->streamstatus = mediacontrol_InitStatus;            break;        case END_S         :            retval->streamstatus = mediacontrol_EndStatus;            break;        default :            retval->streamstatus = mediacontrol_UndefinedStatus;            break;        }        retval->url = strdup( p_input->input.p_item->psz_uri );        /* TIME and LENGTH are in microseconds. We want them in ms */        var_Get( p_input, "time", &val);        retval->position = val.i_time / 1000;        var_Get( p_input, "length", &val);        retval->length = val.i_time / 1000;        retval->position = mediacontrol_unit_convert( p_input,                                                      mediacontrol_MediaTime, a_key,                                                      retval->position );        retval->length   = mediacontrol_unit_convert( p_input,                                                      mediacontrol_MediaTime, a_key,                                                      retval->length );    }    return retval;}unsigned shortmediacontrol_sound_get_volume( mediacontrol_Instance *self,                               mediacontrol_Exception *exception ){    short retval;    audio_volume_t i_volume;    if( !self->p_intf )    {        RAISE( mediacontrol_InternalException, "No interface module" );        return 0;    }    aout_VolumeGet( self->p_intf, &i_volume );    retval = i_volume;    return retval;}voidmediacontrol_sound_set_volume( mediacontrol_Instance *self,                               const unsigned short volume,                               mediacontrol_Exception *exception ){    if( !self->p_intf )    {        RAISE( mediacontrol_InternalException, "No interface module" );        return;    }    aout_VolumeSet( self->p_intf,( audio_volume_t )volume );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -