📄 jma_video_player.c
字号:
/* Open successfully */
if (!video_player.progressive_dl)
{
/* MED would set mute when play dummy audio for pure video */
jam_set_aud_volume_level(jam_get_aud_volume_level());
if (video_player.stoptime != -1)
{
mdi_video_ply_set_stop_time(video_player.stoptime);
}
/* stop loading animation */
gdi_image_stop_animation_all();
mdi_video_ply_set_brightness(MDI_VIDEO_BRIGHTNESS_0);
mdi_video_ply_set_contrast(MDI_VIDEO_CONTRAST_0);
if (video_player.state == JAVA_MEDIA_STATE_PLAYING)
{
video_player.state = JAVA_MEDIA_STATE_READY;
ms = mdi_video_ply_seek(video_player.current_time);
video_player.seek_error = (ms == MED_RES_OK)? KAL_FALSE : KAL_TRUE;
jma_video_player_play(MMA_TYPE_MPEG, video_player.id);
}
else if (video_player.state == JAVA_MEDIA_STATE_PAUSED ||
video_player.state == JAVA_MEDIA_STATE_STOPPED_PAUSED)
{
if (video_player.track != MDI_VIDEO_TRACK_A_ONLY)
{
jma_video_player_refine_display_info();
ret = jma_video_player_process_layer();
/* Seek to suspended time and Draw the layer */
ms = mdi_video_ply_seek_and_get_frame(
video_player.current_time, preview_layer_handle);
jui_widget_refresh_screen(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);
}
else
{
ms = mdi_video_ply_seek(video_player.current_time);
}
video_player.seek_error = (ms == MED_RES_OK)? KAL_FALSE : KAL_TRUE;
}
else if (video_player.state == JAVA_MEDIA_STATE_READY)
{
ms = mdi_video_ply_seek(video_player.current_time);
video_player.seek_error = (ms == MED_RES_OK)? KAL_FALSE : KAL_TRUE;
}
}
#ifdef __MMI_VIDEO_PDL__
else
{
/* state when Suspended: PAUSED, PLAYING, BUFFERING. Need to prepare layer for draw frame */
if (video_player.track != MDI_VIDEO_TRACK_A_ONLY &&
video_player.state != JAVA_MEDIA_STATE_READY &&
video_player.state != JAVA_MEDIA_STATE_OPENING)
{
jma_video_player_refine_display_info();
ret = jma_video_player_process_layer();
}
/* Change state as OPENING */
kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_OPENING);
video_player.state = JAVA_MEDIA_STATE_OPENING;
}
#endif
JMA_CS_LEAVE(RESOUCE_NO_ERROR);
}
/*****************************************************************************
* FUNCTION
* jma_video_player_close_hdlr
* DESCRIPTION
* This function is mpeg close handler invoked when finalizeResoueceMgr executes
* PARAMETERS
* hdlr [IN]
* RETURNS
* resource_error_code
*****************************************************************************/
kal_int32 jma_video_player_close_hdlr(kal_int32 java_player)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
#ifdef __MMI_VIDEO_PDL__
kal_int32 result = -1;
#endif
MDI_RESULT ms;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_CLOSE_HDLR, java_player, video_player.state);
JMA_CS_ENTER(RESOUCE_FAIL);
if (video_player.id != java_player)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RESOURCE_ERROR, video_player.id);
JMA_CS_LEAVE(RESOUCE_FAIL);
}
/* With resource */
if (!is_vm_suspend_media)
{
if (video_player.state == JAVA_MEDIA_STATE_PLAYING)
{
ms = mdi_video_ply_stop();
}
#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);
}
#endif
if (!video_player.progressive_dl)
{
if (video_player.buffer == NULL)
{
ms = mdi_video_ply_close_clip_file();
}
else
{
ms = mdi_video_ply_close_clip_buffer();
}
}
#ifdef __MMI_VIDEO_PDL__
else
{
mdi_video_progressive_close_file();
}
#endif
}
#ifdef __MMI_VIDEO_PDL__
if (video_player.progressive_dl)
{
/* Close cache file */
if (video_player.cache_handle != NULL)
{
result = FS_Close(video_player.cache_handle);
video_player.cache_handle = NULL;
}
/* Delete cache file */
result = FS_Delete(video_player.filename);
if (result != FS_NO_ERROR)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_MARKER_FAIL);
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, result);
}
}
#endif
/* Release buffer */
if (video_player.buffer != NULL)
{
jvm_free(video_player.buffer);
video_player.buffer = NULL;
}
if (video_player.track != MDI_VIDEO_TRACK_A_ONLY)
{
jui_widget_set_hardware_layer(GDI_NULL_HANDLE, NULL, NULL);
jui_widget_refresh_screen(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);
if (preview_layer_handle != GDI_LAYER_EMPTY_HANDLE)
{
gdi_layer_free(preview_layer_handle);
preview_layer_handle = GDI_LAYER_EMPTY_HANDLE;
ASSERT(preview_buf_ptr != NULL);
mmi_frm_scrmem_free(preview_buf_ptr);
preview_buf_ptr = NULL;
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RELEASE_SCR_MEMORY);
}
}
if (video_player.is_double_buffer)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_STOP_DOUBLE_BUFFER);
jui_widget_stop_double_buffer();
video_player.is_double_buffer = KAL_FALSE;
}
jma_video_player_reset_parameter();
/* Backlight control */
jvm_force_backlight_on(KAL_FALSE);
JMA_CS_LEAVE(RESOUCE_NO_ERROR);
}
/*****************************************************************************
* FUNCTION
* jma_video_player_play_finish_hdlr
* DESCRIPTION
* //mmi_vodply_player_play_finish_hdlr
* function to be called when play finished.
* PARAMETERS
* result [IN] >=0, means successfully finished, if result < 0 measn some error happened)
* RETURNS
* void
*****************************************************************************/
void jma_video_player_play_finish_hdlr(MDI_RESULT result)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
MDI_RESULT ms;
java_mma_type_enum event_type;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_PLAY_FINISH_HDLR, result, video_player.state);
JMA_CS_ENTER(JMA_VOID);
if (video_player.state == JAVA_MEDIA_STATE_NULL)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_MARKER_FAIL);
JMA_CS_LEAVE(JMA_VOID);
}
mdi_video_ply_get_cur_play_time(&video_player.current_time);
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, video_player.current_time);
if (result == MDI_RES_VDOPLY_ERR_DRM_DURATION_USED)
{
jma_video_player_close(MMA_TYPE_MPEG, video_player.id);
jvm_post_mma_event(MMA_EVENT_ERROR, video_player.id, MMA_ERR_DRM_RIGHT_EXPIRED);
JMA_CS_LEAVE(JMA_VOID);
}
else if (result == MDI_RES_VDOPLY_REACH_STOP_TIME)
{
video_player.is_play_requested = KAL_FALSE;
/* STOPPED_PAUSED should be the same as PAUSED state.
The only difference is whether to call drm_disable_Consume_Count() in play() */
kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_STOPPED_PAUSED);
video_player.state = JAVA_MEDIA_STATE_STOPPED_PAUSED;
/* Clear stop time */
mdi_video_ply_set_stop_time((U64) -1);
video_player.stoptime = -1;
ms = mdi_video_ply_seek(video_player.current_time);
video_player.seek_error = (ms == MED_RES_OK)? KAL_FALSE : KAL_TRUE;
event_type = MMA_EVENT_STOPPED_AT_TIME;
}
#ifdef __MMI_VIDEO_PDL__ /* Underflow */
else if (result == MDI_RES_VDOPLY_PROGRESSIVE_FILE_NOT_ENOUGH)
{
/* 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;
jma_video_player_cache_buffering_cyclic();
JMA_CS_LEAVE(JMA_VOID);
}
#endif
else
{
video_player.is_play_requested = KAL_FALSE;
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.play_finish_time = video_player.current_time;
/* set current time as 0 for playing at next time */
video_player.current_time = 0;
ms = mdi_video_ply_seek(0);
video_player.seek_error = (ms == MED_RES_OK)? KAL_FALSE : KAL_TRUE;
if (ms != MDI_RES_VDOPLY_SUCCEED)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_MARKER_FAIL);
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, ms);
}
event_type = MMA_EVENT_END_OF_MEDIA;
}
/* enqueue to VM event queue */
jvm_post_mma_event(event_type, (kal_int16) video_player.id, (kal_int64) video_player.play_finish_time);
JMA_CS_LEAVE(JMA_VOID);
}
/*****************************************************************************
* FUNCTION
* jma_video_player_file_open
* DESCRIPTION
* This function opens video file
* PARAMETERS
* mma_type [IN]
* java_player [IN]
* filename [?]
* RETURNS
* kal_bool
*****************************************************************************/
kal_bool jma_video_player_open(kal_int32 mma_type, kal_int32 java_player, kal_char *data, kal_int32 length, kal_char *filename)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
MDI_RESULT ms = MDI_RES_VDOPLY_ERR_FAILED;
mdi_video_info_struct vdo_clip;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_OPEN, java_player);
JMA_CS_ENTER(KAL_FALSE);
/* find free player */
if (video_player.id != INVALID_JPLAYER_ID)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RESOURCE_ERROR, video_player.id);
JMA_CS_LEAVE(KAL_FALSE);
}
if (jma_audio_recorder_is_active() || jma_audio_player_is_active())
{
JMA_CS_LEAVE(KAL_FALSE);
}
if (video_player.state == JAVA_MEDIA_STATE_NULL)
{
/* Backlight control */
jvm_force_backlight_on(KAL_TRUE);
gdi_layer_reset_clip();
gdi_layer_reset_text_clip();
/* Enable pure-audio */
mdi_video_ply_enable_aud_only_video_clip();
if (filename == NULL)
{
/* Copy Data from KNI Layer */
video_player.buffer = jvm_malloc(length);
if (video_player.buffer == NULL)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_MARKER_FAIL);
JMA_CS_LEAVE(KAL_FALSE);
}
memcpy(video_player.buffer, data, length);
video_player.buffer_length = length;
ms = mdi_video_ply_open_clip_buffer(video_player.buffer, video_player.buffer_length, &vdo_clip);
}
else
{
/* Copy FileName from KNI Layer */
mmi_ucs2cpy((S8*) video_player.filename, filename);
ms = mdi_video_ply_open_clip_file((S8*) video_player.filename, &vdo_clip);
}
if (ms == MDI_RES_VDOPLY_SUCCEED)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_START_DOUBLE_BUFFER);
jui_widget_start_double_buffer();
video_player.is_double_buffer = KAL_TRUE;
}
else if (ms == MDI_RES_VDOPLY_ERR_DRM_PROHIBITED)
{
/* Release buffer */
if (video_player.buffer != NULL)
{
jvm_free(video_player.buffer);
video_player.buffer = NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -