📄 jma_video_player.c
字号:
/* 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 + -