[Previous] [Contents] [Next]

dvdplayer

DVD Player

Name:

/usr/photon/bin/dvdplayer

Description:

The DVD player plugin, dvdplayer, is based on the Xing DVD Player. It plays DVDs and supports:

While playing a DVD, the plugin behaves like a multitrack program. Individual chapters of the DVD represent the tracks.

Calling MvInit() sets the value of MvPluginCtrl_t.MvPluginFlags_t pflags to MV_HASDFLTURL, but this is for the DVD operation. You can still play files using the CMD_PLUGIN_OPEN_URLS command. The URL can be set to dvd on an CMD_PLUGIN_OPEN_URLS to tell the plugin to use DVD mode.

Resource profile utilization and library prerequisites

See the Resource Profile Estimates and Library Dependencies appendix.

Relevant commands

Valid commands for the DVD player plugin are:

CMD_PLUGIN_ANGLE
CMD_PLUGIN_BOOKMARK_SET
CMD_PLUGIN_CLOSE
CMD_PLUGIN_DIRECT_AUDIO
CMD_PLUGIN_GET_STATUS
CMD_PLUGIN_KARAOKE_MIX
CMD_PLUGIN_KARAOKE_RECORD
CMD_PLUGIN_MENU
CMD_PLUGIN_MUTE
CMD_PLUGIN_OPEN_URLS
CMD_PLUGIN_PAUSE
CMD_PLUGIN_REVERSE_PLAY
CMD_PLUGIN_SCAN_BACK
CMD_PLUGIN_SCAN_FORWARD
CMD_PLUGIN_SEEK_RELATIVE
CMD_PLUGIN_SEEK_TO
CMD_PLUGIN_SELECT
CMD_PLUGIN_SELECT_AUDIO
CMD_PLUGIN_SELECT_DOWN
CMD_PLUGIN_SELECT_LEFT
CMD_PLUGIN_SELECT_RIGHT
CMD_PLUGIN_SELECT_SUBTITLE
CMD_PLUGIN_SELECT_UP
CMD_PLUGIN_SEND_MESSAGE
CMD_PLUGIN_SET_PARAMETER
CMD_PLUGIN_SET_WINDOW
CMD_PLUGIN_SLOW_MOTION
CMD_PLUGIN_START
CMD_PLUGIN_STEP
CMD_PLUGIN_STOP

Callback handler example

This sample callback handler is used by phplay to analyze state changes and status information. After verifying that the plugin handle is still valid, the value of the MvEventFlags_t change variable is examined to determine which field of the MvPluginStatus_t const *pst structure is valid.

Values that may be used for MvEventFlags_t change include:

MVS_AUDIO_LIST
MVS_DISPLAY_INFO
MVS_DURATION
MVS_ERRORMSG
MVS_FLAGS
MVS_MEDIA
MVS_PLUGIN_STATE
MVS_POSITION
MVS_SUBTITLE_LIST
MVS_VPSIZE

void dvd_vcb( MvPluginCtrl_t *ctrl, MvEventFlags_t change, 
              MvPluginStatus_t const *pst )
{
    PtArg_t args[2];
    const char *status = "No plugin";
    if( mplayer.pctrl == NULL )
    { //this plugin has been closed
        if( pst->state == MV_DEAD )
    { // plugin is ready for destruction
        UnloadDll( ctrl );
        free( ctrl );
        // reset plugin count
        mplayer.pluginIsLoaded = FALSE;
    }
        // show the correct pause/play button
         SetPlayPauseButton( TRUE );
        return;
    }
    
/* CHECK IF PLUGIN STATE HAS CHANGE */  
    if( change & MVS_PLUGIN_STATE )  
    { //plugin state has change
        MvCommandData_t cmdData = {0};
        switch( pst->state ) 
        {
            case MV_DEAD:
                status ="Dead";
                mplayer.pluginIsLoaded = FALSE;
                SetStopEjectButton( FALSE );
                cbBaseClose( 0, 0, 0 );
                return;

            case MV_CLOSED:
                status = ( mplayer.pctrl->lastst == MV_OPENING ) ? "Open failed" : "No Clip";
                break;
            
            case MV_OPENING:
                status = "Opening";
                break;

             case MV_STOPPED:
                status = ( mplayer.pctrl->lastst == MV_OPENING ) ? "Opened" : "Stopped";
                mplayer.played = 0;
                cmdData.pluginCtrl              = &mplayer.pctrl->mv;
                cmdData.cmdType                 = CMD_PLUGIN_SEEK_TO;
                cmdData.which                   = MVP_DELTA | MVP_POSITION;
                cmdData.param                   = &mplayer.playback_parms;
                mplayer.playback_parms.delta    = 0;
                mplayer.playback_parms.position = 0;
                mplayer.pctrl->mv.calls->command( &cmdData );
                if( mplayer.playIsSet )
                {
                  if (ControllerGetRepeatType()== MV_REPEAT_THIS_TRACK ||  mplayer.pctrl->lastst == MV_OPENING)
                  {
                    PtTimerArm( ABW_pausePlayButton, 500  );
                  }
                }
                break;

            case MV_PAUSED:
                status = "Paused";
                break;

            case MV_PREFETCHING:
               status = "Prefetching";
                break;

            case MV_PLAYING:
                status = "Playing";
                mplayer.played = 1;
                break;
            
            case MV_PLAYBW:
                status = "Reverse Play";
                break;

            case MV_SCANFW:
                status = "Scanning Forward";
                break;
            
            case MV_SCANBW:
                status = "Scanning Backwards";
                break;

            case MV_STEP:
                status = "Stepping";
                break;

            case MV_SLOW:
                status = "Slow Motion";
                break;

            default:
                status = "Unknown";
                break;
        }
        setbuttons( pst->state); 
        // update mplayer state flag 
        mplayer.pctrl->lastst = pst->state;
        //update DVD state label with new state
        PtSetArg( &args[0], Pt_ARG_TEXT_STRING, status, 0 );
        PtSetResources( ABW_dvd_stateLabel, 1, args );
    }

/* CHECK IF PLUGIN STATUS FLAG HAS CHANGE */
    if( change & MVS_FLAGS )
    {// flags is valid. 
        mplayer.pctrl->psflags = pst->flags;
    }

/* CHECK IF PLUGIN WANT TO RESIZE VIDEO WINDOW */
    if( change & MVS_MEDIA )
    {
        if( mplayer.pctrl->lastst >= MV_STOPPED )
        {
            if( pst->media_info->which & MV_MEDIA_VIDEO_INFO )
            {
                mplayer.vin = *pst->media_info->video;
                if( pst->flags & MVS_AREA )
                {
                    // set video window size to new value specified by plugin
                if( mplayer.playback_parms.video_wgt &&  mplayer.setup.videoSetting.bKeepAspectRatio && !mplayer.setup.bHomeEntertainment)
                {
                  //fprintf(stderr,"Ang in %s resizing video window to x = %d y = %d w = %d h = %d\n",
                  //__FILE__,mplayer.vin.area.pos.x,mplayer.vin.area.pos.y,mplayer.vin.area.size.w,mplayer.vin.area.size.h);
                  PtSetArg( &args[0], Pt_ARG_DIM, &mplayer.vin.area.size, 0 );
                  PtSetResources( ABW_video, 1, args );
                }
                    return;
                }
            }
        }
    }           

/* CHECK IF PLUGIN WANT TO ADJUST PHPLAY VOLUME SETTING */
  if( change & MVS_MEDIA )
  {
    if( pst->media_info->which & MV_MEDIA_AUDIO_INFO )
    {
      PtSetArg( &args[0], Pt_ARG_GAUGE_VALUE, pst->media_info->audio->volume, 0 );
      PtSetResources( ABW_PtSlider_volume, 1, args );
      return;
    }
  }


/* CHECK IF PLUGIN MEDIA INFO IS VALID  */
    if( change & MVS_MEDIA ) 
      //  media_info is valid and points to new media
    {   
        if( mplayer.pctrl->lastst >= MV_STOPPED ) 
        {// last state was MV_STOPPED or MV_PAUSED or MV_PREFETCHING or MV_PLAYING
            const char* title = pst->media_info->title;
            if( title == NULL )
            {
                title = ( title = strrchr( pst->media_info->url, '/' ) ) ? ++title : pst->media_info->url;
            }
            mplayer.pctrl->mediaType    = pst->media_info->type;
            mplayer.pctrl->duration     = pst->media_info->duration;

            //was if( mplayer.pctrl->mediaType & MV_MEDIA_VIDEO )
            if( pst->media_info->which & MV_MEDIA_VIDEO_INFO )
            {
            mplayer.vin = *pst->media_info->video;
            }

            if( mplayer.pctrl->mediaType & MV_MEDIA_SEEKABLE && mplayer.pctrl->duration )
            {
                PtSetArg( &args[0], Pt_ARG_FLAGS, 0, Pt_BLOCKED | Pt_GHOST );
                PtSetResources( ABW_curpos, 1, args );
            }
            if( pst->media_info->type & MV_MEDIA_PLAYLIST )  
            { // the  plugin new media info is a playlist 
                int track;
                ControllerGetPluginList();
                track = ControllerGetActiveTrack();
                ControllerOpenIndex( NULL, track );
            }
            else
            {
                int track;
                MvCommandData_t cmdData = {0};
                // the new plugin media info is not a play list 
                track = ControllerAddUrl( pst->media_info->url, pst->media_info->title, FALSE );
                ControllerSetActiveTrack( track );
                PtSetArg( &args[0], Pt_ARG_TEXT_STRING, ControllerGetActiveUrl() , 0 );
                PtSetResources( ABW_baseInfo, 1, args );
                // repositioning  of the widget to show beginning of time frame 
            PtSetArg( &args[0], Pt_ARG_GAUGE_VALUE, 0, 0 );
            PtSetResources( ABW_curpos, 1, args );

                if(( mplayer.playback_parms.status_frequency = mplayer.pctrl->duration / POS_SLIDER_WIDTH ) > 100 )
                {
                    mplayer.playback_parms.status_frequency = 100;
                }
                cmdData.pluginCtrl           = &mplayer.pctrl->mv;
                cmdData.cmdType              = CMD_PLUGIN_SET_PARAMETER;
                cmdData.which                = MVP_STATUS_FREQ;
                cmdData.param                = &mplayer.playback_parms;
                mplayer.pctrl->mv.calls->command( &cmdData );
            }
        }
        else
        {// last state was MV_DEAD or MV_CLOSED or MV_OPENING

            // reset GUI cursor position
            PtSetArg( &args[0], Pt_ARG_GAUGE_VALUE, 0, 0 );
            PtSetResources( ABW_curpos, 1, args );
            //set_curpos_bg( 0 );
            // make it impossible to move the cursor from the GUI   
            PtSetArg( &args[0], Pt_ARG_FLAGS, ~0, Pt_BLOCKED | Pt_GHOST );
            PtSetResources( ABW_curpos, 1, args );
        }
    }

/* CHECK IF PLUGIN POSITION  IS VALID */
    if( change & MVS_POSITION ) 
    { // position is valid 
        plassert( mplayer.pctrl->duration != 0, "MVS_POSITION is set although duration is 0" );
        if( !( mplayer.cursorIsDrag ) ) 
        {
            // update background cursor position
            mplayer.pctrl->lastpos = pst->position;
            // update cursor position
            PtSetArg( &args[0], Pt_ARG_GAUGE_VALUE, pst->position, 0 );
            PtSetResources( ABW_curpos, 1, args );
            DvdUpdatePosition( pst->position, mplayer.pctrl->duration );
        }
    }

/* CHECK IF PLUGIN DURATION  IS VALID */
    if( change & MVS_DURATION ) 
    {
        //adjust the maximum range of the progress bar widget
        mplayer.pctrl->duration     = pst->duration;
        PtSetArg( &args[0], Pt_ARG_GAUGE_MAXIMUM, pst->duration, 0 );
        PtSetResources( ABW_curpos, 1, args );
    }

/* CHECK IF PLUGIN HAS AN ERROR MESSAGE */
    if( change & MVS_ERRORMSG ) 
    { // there's an error message in errmsg
        popup_error( pst->errormsg );
        mplayer.pluginIsLoaded = FALSE;    
        cbBaseClose( 0, 0, 0 );
        return;
    }

/* CHECK IF DVDPLAYER REQUEST MPLAYER TO UPDATE DVD GUI */
    if( change & MVS_DISPLAY_INFO )
    { 
        PtArg_t arg;
        PtSetArg( &arg, Pt_ARG_TEXT_STRING,pst->displayInfo->title , 0 );
        PtSetResources( ABW_dvd_titleLabel, 1, &arg );
        PtSetArg( &arg, Pt_ARG_TEXT_STRING,pst->displayInfo->chapter , 0 );
        PtSetResources( ABW_dvd_chapterLabel, 1, &arg );
        PtSetArg( &arg, Pt_ARG_TEXT_STRING,pst->displayInfo->angle , 0 );
        PtSetResources( ABW_dvd_angleLabel, 1, &arg );
    }

/* CHECK IF PLUGIN AUDIO LIST IS VALID */
    if( change & MVS_AUDIO_LIST )
    { 
        PtArg_t arg;
        PtListDeleteAllItems( ABW_dvd_audioComboBox );
        PtListAddItems( ABW_dvd_audioComboBox, (const char**) pst->audioList->list, pst->audioList->count, 0 );
        PtSetArg( &arg, Pt_ARG_CBOX_SEL_ITEM,  (const char**) pst->audioList->selectedIndex , 0 );
        PtSetResources( ABW_dvd_audioComboBox, 1, &arg );
    }

/* CHECK IF PLUGIN SUBTITLE LIST IS VALID */
    if( change & MVS_SUBTITLE_LIST )
    { 
        PtArg_t arg;
        char*   str= "None";
        PtListDeleteAllItems( ABW_dvd_subtitleComboBox );
        PtListAddItems( ABW_dvd_subtitleComboBox, (const char**) pst->subtitleList->list, pst->subtitleList->count, 0 );
        PtListAddItems( ABW_dvd_subtitleComboBox, (const char**) &str, 1, 1);
        PtSetArg( &arg, Pt_ARG_CBOX_SEL_ITEM, pst->subtitleList->selectedIndex + 1 , 0 );
        PtSetResources( ABW_dvd_subtitleComboBox, 1, &arg );
    }
}

[Previous] [Contents] [Next]