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

📄 jma_animation_player.c

📁 java 1.1 gemini 08_16
💻 C
📖 第 1 页 / 共 5 页
字号:
    /* 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(&current_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 + -