📄 jma_animation_player.c
字号:
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_ANIMA_PLAYER_CLOSE_HDLR, java_player, video_player.state);
if (video_player.id != java_player)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RESOURCE_ERROR, video_player.id);
return RESOUCE_FAIL;
}
/* With resource */
if (jma_media_player_cs_check_and_enter(KAL_FALSE))
{
if (video_player.state == JAVA_MEDIA_STATE_OPENING)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_STACK_STOP_TIMER);
stack_stop_timer(&java_media_timer);
}
else if (video_player.state == JAVA_MEDIA_STATE_PLAYING)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_STACK_STOP_TIMER);
stack_stop_timer(&java_media_timer);
if (video_player.stoptime != (U64)-1)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_STACK_STOP_TIMER);
stack_stop_timer(&java_stop_time_timer);
}
}
jma_media_player_cs_leave();
}
if (video_player.buffer != NULL)
{
jvm_free(video_player.buffer);
video_player.buffer = NULL;
}
if (anima_info.time_index != NULL)
{
jvm_free(anima_info.time_index);
anima_info.time_index = NULL;
}
#ifdef __DRM_SUPPORT__
/* stop consume drm right */
if (video_player.drm_state == JAVA_DRM_STATE_CONSUMING ||
video_player.drm_state == JAVA_DRM_STATE_PAUSED)
{
jam_drm_stop_consume(video_player.drm_id);
}
#endif
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();
return RESOUCE_NO_ERROR;
}
/*****************************************************************************
* FUNCTION
* jma_anima_player_parse_info_cyclic
* DESCRIPTION
* This function construct the mapping between frame and time
* PARAMETERS
* void
* RETURNS
* TURE or FALSE
*****************************************************************************/
kal_bool jma_anima_player_parse_info_cyclic(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
GDI_RESULT ret;
kal_uint32 *original_time_index;
kal_uint32 original_time_index_length;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_ANIMA_PLAYER_PARSE_INFO_CYCLIC, video_player.state, anima_info.current_frame);
JMA_CS_ENTER(KAL_FALSE);
/****************************************************
* time_index: an array to store gif info
****************************************************/
/* if delay_time == 0, stack_stop_timer() can not prevent time out callback */
if (video_player.state != JAVA_MEDIA_STATE_OPENING)
{
JMA_CS_LEAVE(KAL_FALSE);
}
/* Create layer for GIF decode use */
if (preview_layer_handle == NULL)
{
preview_buf_size = (((video_player.video_width * video_player.video_height * GDI_MAINLCD_BIT_PER_PIXEL) >> 3));
preview_buf_ptr = (kal_uint16*) mmi_frm_scrmem_alloc(preview_buf_size);
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_ALLOCATE_SCR_MEMORY, preview_buf_ptr, preview_buf_size);
if (preview_buf_ptr == NULL)
{
JMA_CS_LEAVE(KAL_FALSE);
}
gdi_layer_create_using_outside_memory(
0, 0, video_player.video_width, video_player.video_height,
&preview_layer_handle,
(PU8) preview_buf_ptr, (S32) preview_buf_size);
}
ASSERT(preview_layer_handle != NULL);
/* Allocate memory to parse info */
if (anima_info.time_index == NULL)
{
ASSERT(anima_info.time_index_length == 0);
anima_info.time_index_length = JMA_ANIMA_FRAME_NUM_STEP;
anima_info.time_index = jvm_malloc(anima_info.time_index_length * sizeof(kal_uint32));
}
/* Enlarte memory to parse info */
if (anima_info.current_frame >= anima_info.time_index_length)
{
original_time_index = anima_info.time_index;
original_time_index_length = anima_info.time_index_length;
anima_info.time_index_length += JMA_ANIMA_FRAME_NUM_STEP;
anima_info.time_index = jvm_malloc(anima_info.time_index_length * sizeof(kal_uint32));
if (anima_info.time_index == NULL)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_MARKER_FAIL);
jvm_free(original_time_index);
jma_anima_player_close(video_player.id);
JMA_CS_LEAVE(KAL_FALSE);
}
memcpy(anima_info.time_index, original_time_index, original_time_index_length * sizeof(kal_uint32));
jvm_free(original_time_index);
}
/* Decode frame */
gdi_layer_push_and_set_active(preview_layer_handle);
if (video_player.buffer != NULL)
{
ret = gdi_image_draw_resized_mem_frames(
0,
0,
video_player.video_width,
video_player.video_height,
video_player.buffer,
GDI_IMAGE_TYPE_GIF,
video_player.buffer_length,
anima_info.current_frame);
}
else
{
ret = gdi_image_draw_resized_file_frames(
0,
0,
video_player.video_width,
video_player.video_height,
video_player.filename,
anima_info.current_frame);
}
gdi_layer_pop_and_restore_active();
if (ret == GDI_SUCCEED)
{
anima_info.delay_time = gdi_anim_get_delay();
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_DD, anima_info.current_frame, anima_info.delay_time);
anima_info.delay_time = (anima_info.delay_time == 0) ? 1 : anima_info.delay_time;
/* Calculate duraion */
video_player.duration += anima_info.delay_time;
/* Store delay time to the array of scan_time */
anima_info.time_index[anima_info.current_frame] = anima_info.delay_time;
anima_info.current_frame ++;
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_STACK_START_TIMER);
stack_start_timer(&java_media_timer, JAVA_MEDIA_TIMER_ANIMA_PARSE_INFO, 1);
}
else
{
/* Invalid format */
if (anima_info.current_frame == 0)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_MARKER_FAIL);
jma_anima_player_close(video_player.id);
JMA_CS_LEAVE(KAL_FALSE);
}
/* The following: Media End */
/* Assign total frame number */
anima_info.frame_number = anima_info.current_frame;
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, anima_info.frame_number);
kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_READY);
video_player.state = JAVA_MEDIA_STATE_READY;
/* Reset current frame for play */
anima_info.current_frame = 0;
/* Reset animation cache when for play */
gdi_image_cache_reset();
/* Free layer for GIF decode use */
gdi_layer_free(preview_layer_handle);
preview_layer_handle = GDI_LAYER_EMPTY_HANDLE;
mmi_frm_scrmem_free(preview_buf_ptr);
preview_buf_ptr = NULL;
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RELEASE_SCR_MEMORY);
}
JMA_CS_LEAVE(KAL_TRUE);
}
/*****************************************************************************
* FUNCTION
* jma_anima_player_play_finish_hdlr
* DESCRIPTION
* The function is play finish handler
* PARAMETERS
* event_type [IN]
* RETURNS
* void
*****************************************************************************/
void jma_anima_player_check_stop_time_cyclic(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_int64 current_time;
kal_int32 ticks = kal_milli_secs_to_ticks(300); /* 300 ms */
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_ANIMA_PLAYER_CHECK_STOP_TIME_CYCLIC, video_player.state);
JMA_CS_ENTER(JMA_VOID);
if (video_player.state != JAVA_MEDIA_STATE_PLAYING)
{
kal_print("Animation player FAIL: state is not right!");
JMA_CS_LEAVE(JMA_VOID);
}
ASSERT(video_player.state == JAVA_MEDIA_STATE_PLAYING);
current_time = jma_anima_player_get_media_time(video_player.id);
/* Reach stop time */
if (current_time >= video_player.stoptime)
{
/* State will change to PAUSED in this function */
jma_anima_player_pause(video_player.id);
/* Reset stop time */
video_player.stoptime = (U64) -1;
jvm_post_mma_event(MMA_EVENT_STOPPED_AT_TIME, (kal_int16) video_player.id, (kal_int64) video_player.current_time);
}
/* Restart timer again */
else
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_STACK_START_TIMER);
stack_start_timer(&java_stop_time_timer, 0, ticks);
}
JMA_CS_LEAVE(JMA_VOID);
}
/*****************************************************************************
* FUNCTION
* jma_anima_player_draw_current_frame
* DESCRIPTION
* This function draws a single frame to LCD
* PARAMETERS
* void
* RETURNS
* kal_bool
*****************************************************************************/
void jma_anima_player_draw_frame_cyclic(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint32 ticks, current_tick, tick_before_decode, tick_after_decode;
kal_int64 elapse_tick, adjusted_delay_time;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_ANIMA_PLAYER_DRAW_FRAME_CYCLIC, video_player.state);
JMA_CS_ENTER(JMA_VOID);
/* if delay_time == 0, stack_stop_timer() can not prevent time out callback */
if (video_player.state != JAVA_MEDIA_STATE_PLAYING)
{
JMA_CS_LEAVE(JMA_VOID);
}
/* Draw next frame */
anima_info.current_frame ++;
kal_get_time(&tick_before_decode);
if (!jma_anima_player_draw_current_frame())
{
/* Media End */
kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_READY);
video_player.state = JAVA_MEDIA_STATE_READY;
/* Does not reach stop time yet */
if (video_player.stoptime != (U64)-1)
{
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_STACK_STOP_TIMER);
stack_stop_timer(&java_stop_time_timer);
}
/* Update current time */
kal_get_time(¤t_tick);
elapse_tick = current_tick - anima_info.start_tick;
if (elapse_tick < 0)
{
elapse_tick = 0xffffffff - anima_info.start_tick + current_tick;
}
video_player.current_time += kal_ticks_to_milli_secs(elapse_tick);
/* Reset current frame index to the last frame */
anima_info.current_frame --;
jvm_post_mma_event(MMA_EVENT_END_OF_MEDIA, (kal_int16) video_player.id, (kal_int64) video_player.current_time);
JMA_CS_LEAVE(JMA_VOID);
}
kal_get_time(&tick_after_decode);
anima_info.delay_time = gdi_anim_get_delay();
/* Calculate adjusted delay time: Include decode time */
elapse_tick = (S64) tick_after_decode - tick_before_decode;
if (elapse_tick < 0)
{
elapse_tick = 0xffffffff - tick_before_decode + tick_after_decode;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -