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

📄 jma_video_player.c

📁 java 1.1 gemini 08_16
💻 C
📖 第 1 页 / 共 5 页
字号:
            
            /* Backlight control */
            jvm_force_backlight_on(KAL_FALSE);
            JMA_CS_LEAVE(KAL_FALSE);
        }
        else
        {
            /* Release buffer */
            if (video_player.buffer != NULL)
            {
                jvm_free(video_player.buffer);
                video_player.buffer = NULL;
            } 
            
            /* Backlight control */
            jvm_force_backlight_on(KAL_FALSE);
            JMA_CS_LEAVE(KAL_FALSE);
        }

        /* MED would set mute when play dummy audio for pure video */
        jam_set_aud_volume_level(jam_get_aud_volume_level()); 

        video_player.video_width = vdo_clip.width;
        video_player.video_height = vdo_clip.height;
        video_player.track = vdo_clip.track;
        video_player.duration = vdo_clip.total_time_duration;

        mmi_ucs2ncpy(video_player.title_desc, vdo_clip.title_desc, MDI_VIDEO_CONTENT_BUFFER_SIZE);
        mmi_ucs2ncpy(video_player.author_desc, vdo_clip.author_desc, MDI_VIDEO_CONTENT_BUFFER_SIZE);
        mmi_ucs2ncpy(video_player.date_desc, vdo_clip.date_desc, MDI_VIDEO_CONTENT_BUFFER_SIZE);
        mmi_ucs2ncpy(video_player.copyright_desc, vdo_clip.copyright_desc, MDI_VIDEO_CONTENT_BUFFER_SIZE);
        
        ASSERT(video_player.track != MDI_VIDEO_TRACK_NONE);
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_DD, video_player.duration, (int) video_player.track);
             
        /* Succeed to acquire resource */
        jma_register_device(
            JAVA_MEDIA_MPEG_PLAYER_DEVICE,
            java_player, 
            &jma_video_player_suspend_hdlr, 
            &jma_video_player_resume_hdlr, 
            &jma_video_player_close_hdlr);

        kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_READY);
        video_player.state = JAVA_MEDIA_STATE_READY;
        video_player.id = java_player;
        video_player.stoptime = -1;
        video_player.volume = DEFAULT_VIDEO_VOLUME;
        video_player.current_time = 0;
        video_player.progressive_dl = KAL_FALSE;
        video_player.is_play_requested = KAL_FALSE;
        video_player.device_type = JAVA_MEDIA_MPEG_PLAYER_DEVICE;

        /* Need to seek before calling play at the first time */        
        ms = mdi_video_ply_seek(video_player.current_time);
        video_player.seek_error = (ms == MED_RES_OK)? KAL_FALSE : KAL_TRUE;
    }

    JMA_CS_LEAVE(KAL_TRUE);
}


/*****************************************************************************
 * FUNCTION
 *  jma_video_player_pause
 * DESCRIPTION
 *  This function submit VideoPause request to media task.
 * PARAMETERS
 *  mma_type        [IN]        
 *  java_player     [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
void jma_video_player_pause(kal_int32 mma_type, kal_int32 java_player)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
#ifdef __MMI_VIDEO_PDL__
    MDI_RESULT ms;
#endif

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_PAUSE, java_player, video_player.state);
    JMA_CS_ENTER(JMA_VOID);

    if (video_player.id != java_player)
    {
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RESOURCE_ERROR, video_player.id);
        JMA_CS_LEAVE(JMA_VOID);
    }

    video_player.is_play_requested = KAL_FALSE;
    
    if (video_player.state == JAVA_MEDIA_STATE_PLAYING)
    {
        mdi_video_ply_stop();
        mdi_video_ply_get_cur_play_time(&video_player.current_time);

        if (video_player.track != MDI_VIDEO_TRACK_A_ONLY)
        {
            /* Don't need to seek. Driver would leave the last frame onto preview layer */
            /* Draw the last frame onto screen to avoid discontinuity if MIDlet draws other things */
            jui_widget_refresh_screen(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);
        }
       
        kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_PAUSED);
        video_player.state = JAVA_MEDIA_STATE_PAUSED;
       
    }
#ifdef __MMI_VIDEO_PDL__  
    else if (video_player.state == JAVA_MEDIA_STATE_BUFFERING)
    {
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_STACK_STOP_TIMER);
        stack_stop_timer(&java_media_timer);

        /* Clear layer in order to clean progress bar */
        if (video_player.track != MDI_VIDEO_TRACK_A_ONLY)
        {
            ASSERT(preview_layer_handle != NULL);
            ms = mdi_video_ply_seek_and_get_frame(
                    video_player.current_time, 
                    preview_layer_handle);
            video_player.seek_error = (ms == MED_RES_OK)? KAL_FALSE : KAL_TRUE;
            jui_widget_refresh_screen(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);
        }
        
        kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_PAUSED);
        video_player.state = JAVA_MEDIA_STATE_PAUSED;
    }
#endif    
    JMA_CS_LEAVE(JMA_VOID);
}



/*****************************************************************************
 * FUNCTION
 *  jma_video_player_play_internal
 * DESCRIPTION
 *  This function plays video file
 * PARAMETERS
 *  mma_type        [IN]        
 *  java_player     [IN]        
 * RETURNS
 *  kal_bool
 *****************************************************************************/
static kal_bool jma_video_player_play_internal()
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    MDI_RESULT ms = MDI_RES_VDOPLY_SUCCEED;
    kal_bool ret = KAL_FALSE;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    /* Set volume before playing */
    mdi_video_ply_set_audio_level(video_player.volume);

    /* In STOPPED_PAUSED state, Don't call disable_consume_count() */
    if (video_player.state == JAVA_MEDIA_STATE_PAUSED)
    {
        /* DRM does not consume count */
    #ifdef __DRM_SUPPORT__    
        mdi_video_ply_drm_disable_consume_count();
    #endif 
    }
    
    if (video_player.track != MDI_VIDEO_TRACK_A_ONLY)
    {
        jma_video_player_refine_display_info();
        ret = jma_video_player_process_layer();
    
        /* Config hardware layer: even if in invisible case */
        jui_widget_set_hardware_layer(preview_layer_handle, &blt_layer_flag, &preview_layer_flag);
        if (video_ctrl_info.is_visible == KAL_FALSE)
        {
            jui_widget_set_hardware_layer(GDI_NULL_HANDLE, NULL, NULL);
            jui_widget_refresh_screen(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);
        }

        mdi_video_ply_enable_partial_display();
        ms = mdi_video_ply_play(
                preview_layer_handle,
                blt_layer_flag,     /* blt layer */
                preview_layer_flag,   /* play_layer_flag */
                1,                          /* repeat */
                video_ctrl_info.is_visible, /* visual update */
                TRUE,
                MDI_DEVICE_SPEAKER2,
                MDI_VIDEO_LCD_ROTATE_0,     /* rotate */
                video_player.play_speed,    /* VDOPLY_FEATURE_SPEED_1 */
                jma_video_player_play_finish_hdlr);
    }
    else
    {
        ms = mdi_video_ply_play(
                NULL,
                0,          /* blt layer */
                0,          /* play_layer_flag */
                1,          /* repeat */
                KAL_FALSE,  /* visual update */
                TRUE,
                MDI_DEVICE_SPEAKER2,
                MDI_VIDEO_LCD_ROTATE_0,     /* rotate */
                video_player.play_speed,    /* VDOPLY_FEATURE_SPEED_1 */
                jma_video_player_play_finish_hdlr);
    }
    
    if (ms == MDI_RES_VDOPLY_SUCCEED)
    {
        kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_PLAYING);
        video_player.state = JAVA_MEDIA_STATE_PLAYING;
        ret = KAL_TRUE;
    }
    else if (ms == MDI_RES_VDOPLY_REACH_STOP_TIME ||
             ms == MDI_RES_VDOPLY_PROGRESSIVE_FILE_NOT_ENOUGH)
    {
        jma_video_player_play_finish_hdlr(ms);
        ret = KAL_TRUE;
    }
    else if (ms == MDI_RES_VDOPLY_ERR_DRM_PROHIBITED)
    {
        /* If video stay in READY state, in resume handler, disable_consume_count()
           will make the player can play again */
        jma_video_player_close(MMA_TYPE_MPEG, video_player.id);
        
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_MARKER_FAIL);
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, ms);
        ret = KAL_FALSE;
    }
    else
    {
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_MARKER_FAIL);
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, ms);
        ret = KAL_FALSE;
    }
    
    return ret;
}


/*****************************************************************************
 * FUNCTION
 *  jma_video_player_play
 * DESCRIPTION
 *  This function plays video file
 * PARAMETERS
 *  mma_type        [IN]        
 *  java_player     [IN]        
 * RETURNS
 *  kal_bool
 *****************************************************************************/
kal_bool jma_video_player_play(kal_int32 mma_type, kal_int32 java_player)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    /* When state == OPENING, play() should return KAL_TRUE */
    kal_bool ret = KAL_TRUE; 
#ifdef __MMI_VIDEO_PDL__    
    kal_int32 dl_percentage;
    MDI_RESULT ms;
#endif

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_PLAY, java_player, video_player.state);
    JMA_CS_ENTER(KAL_FALSE);
    if (video_player.id != java_player)
    {
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RESOURCE_ERROR, video_player.id);
        JMA_CS_LEAVE(KAL_FALSE);
    }

    if (video_player.state == JAVA_MEDIA_STATE_PLAYING)
    {
        JMA_CS_LEAVE(KAL_TRUE);
    }

    video_player.is_play_requested = KAL_TRUE;

    /* Reset play finish time for the play of this time */
    video_player.play_finish_time = 0;  
    
    if (video_player.state == JAVA_MEDIA_STATE_READY ||
        video_player.state == JAVA_MEDIA_STATE_PAUSED ||
        video_player.state == JAVA_MEDIA_STATE_STOPPED_PAUSED)
    {
        /* If seek error, video driver will assert if call play */
        if (video_player.seek_error == KAL_TRUE)
        {
            kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_MARKER_FAIL);
            JMA_CS_LEAVE(KAL_FALSE);
        }
        
        /* Video Player */
        if (!video_player.progressive_dl)
        {
            ret = jma_video_player_play_internal();
        }        
        /* Progressive Player */
    #ifdef __MMI_VIDEO_PDL__    
        else 
        {
            mdi_video_progressive_get_buf_percentage(&dl_percentage);
            kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, dl_percentage);

            /* play directly: do not draw 100% progress bar */
            if (dl_percentage == 100)
            {
                ret = jma_video_player_play_internal();
            }
            else
            {  
                /* Prepare layer with content to draw progress bar */
                if (video_player.track != MDI_VIDEO_TRACK_A_ONLY && 
                    preview_layer_handle == NULL)
                {
                    jma_video_player_refine_display_info();
                    ret = jma_video_player_process_layer();
                    ms = mdi_video_ply_seek_and_get_frame(
                                video_player.current_time,
                                preview_layer_handle);
                    video_player.seek_error = (ms == MED_RES_OK)? KAL_FALSE : KAL_TRUE;
                    jui_widget_refresh_screen(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);
                }
                /* change as buffering state directly */
                kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_BUFFERING);
                video_player.state = JAVA_MEDIA_STATE_BUFFERING;
                ret = jma_video_player_cache_buffering_cyclic();
            }
        } 
    #endif    
    }
    
    JMA_CS_LEAVE(ret);  
}


/*****************************************************************************
 * FUNCTION
 *  jma_video_player_file_close
 * DESCRIPTION
 *  This function closes video file
 * PARAMETERS
 *  mma_type        [IN]        
 *  java_player     [IN]        
 * RETURNS
 *  void
 *****************************************************************************/
void jma_video_player_close(kal_int32 mma_type, kal_int32 java_player)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    MDI_RESULT ms;
#ifdef __MMI_VIDEO_PDL__     
    kal_int32 result;
#endif    

⌨️ 快捷键说明

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