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

📄 jma_video_player.c

📁 java 1.1 gemini 08_16
💻 C
📖 第 1 页 / 共 5 页
字号:

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

    video_player.stoptime = stime;

    mdi_video_ply_set_stop_time(stime);
    JMA_CS_LEAVE(stime); 
}


/*****************************************************************************
 * FUNCTION
 *  jma_video_player_set_rate
 * DESCRIPTION
 *  This function sets play speed, unit: millirate
 * PARAMETERS
 *  mma_type        [IN]        
 *  java_player     [IN]        
 *  stime           [IN]        
 * RETURNS
 *  long - stop time set
 *****************************************************************************/
kal_int32 jma_video_player_set_rate(kal_int32 java_player, kal_int32 rate)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 play_speed[9] = {
                VDOPLY_FEATURE_SPEED_0,
                VDOPLY_FEATURE_SPEED_1,
                VDOPLY_FEATURE_SPEED_2,
                VDOPLY_FEATURE_SPEED_3,
                VDOPLY_FEATURE_SPEED_4,
                VDOPLY_FEATURE_SPEED_5,
                VDOPLY_FEATURE_SPEED_6,
                VDOPLY_FEATURE_SPEED_7,
                VDOPLY_FEATURE_SPEED_8};
    kal_int32 i, choose_speed = 0, diff, min_diff;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_SET_RATE, java_player, rate);
    JMA_CS_ENTER(0);
    /* Check if java_player id is valid */
    if (video_player.id != java_player)
    {
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RESOURCE_ERROR, video_player.id);
        JMA_CS_LEAVE(0);
    }

    /* Only mp4, 3gp support RateControl */
    if (video_player.device_type != JAVA_MEDIA_MPEG_PLAYER_DEVICE)
    {
        JMA_CS_LEAVE(0);
    }
    
    /* Change unit */
    rate /= 1000;
    
    /* Find the closest play speed */
    min_diff = 0x7fffffff;
    for (i=0; i < VDOPLY_FEATURE_SPEED_COUNT; i++)
    {
        diff = play_speed[i] - rate;
        diff = (diff > 0) ? diff : -diff;
        if (diff < min_diff)
        {
            min_diff = diff;
            choose_speed = play_speed[i];
        }
    }    

    /* Update parameter */
    video_player.play_speed = choose_speed;

    if (video_player.state == JAVA_MEDIA_STATE_PLAYING)
    {
        /* Stop video player first */
        jma_video_player_pause(MMA_TYPE_MPEG, java_player);
        /* Play again to update play speed */        
        jma_video_player_play(MMA_TYPE_MPEG, java_player);
    }  

    kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, 1000 * choose_speed);
    JMA_CS_LEAVE(1000 * choose_speed);
}



/*****************************************************************************
 * FUNCTION
 *  jma_video_player_get_rate
 * DESCRIPTION
 *  This function gets play speed, unit: millirate 
 * PARAMETERS
 *  mma_type        [IN]        
 *  java_player     [IN]        
 *  stime           [IN]        
 * RETURNS
 *  long - stop time set
 *****************************************************************************/
kal_int32 jma_video_player_get_rate(kal_int32 java_player)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_GET_RATE, java_player);

    /* Check if java_player id is valid */
    if (video_player.id != java_player)
    {
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RESOURCE_ERROR, video_player.id);
        return 0;
    }

    kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, 1000 * video_player.play_speed);
    return (1000 * video_player.play_speed);
}


/*****************************************************************************
 * FUNCTION
 *  jma_video_player_get_max_rate
 * DESCRIPTION
 *  This function gets max play speed, unit: millirate 
 * PARAMETERS
 *  mma_type        [IN]        
 *  java_player     [IN]        
 *  stime           [IN]        
 * RETURNS
 *  long - stop time set
 *****************************************************************************/
kal_int32 jma_video_player_get_max_rate(kal_int32 java_player)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 play_speed[9] = {
                VDOPLY_FEATURE_SPEED_0,
                VDOPLY_FEATURE_SPEED_1,
                VDOPLY_FEATURE_SPEED_2,
                VDOPLY_FEATURE_SPEED_3,
                VDOPLY_FEATURE_SPEED_4,
                VDOPLY_FEATURE_SPEED_5,
                VDOPLY_FEATURE_SPEED_6,
                VDOPLY_FEATURE_SPEED_7,
                VDOPLY_FEATURE_SPEED_8};
        
    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_GET_MAX_RATE, java_player);

    /* Check if java_player id is valid */
    if (video_player.id != java_player)
    {
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RESOURCE_ERROR, video_player.id);
        return 0;
    }

    kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, 1000 * play_speed[VDOPLY_FEATURE_SPEED_COUNT - 1]);
    return (1000 * play_speed[VDOPLY_FEATURE_SPEED_COUNT - 1]);
}


/*****************************************************************************
 * FUNCTION
 *  jma_video_player_get_min_rate
 * DESCRIPTION
 *  This function gets min play speed, unit: millirate 
 * PARAMETERS
 *  mma_type        [IN]        
 *  java_player     [IN]        
 *  stime           [IN]        
 * RETURNS
 *  long - stop time set
 *****************************************************************************/
kal_int32 jma_video_player_get_min_rate(kal_int32 java_player)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_GET_MIN_RATE, java_player);

    /* Check if java_player id is valid */
    if (video_player.id != java_player)
    {
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_RESOURCE_ERROR, video_player.id);
        return 0;
    }

    kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, 1000 * VDOPLY_FEATURE_SPEED_0);
    return (1000 * VDOPLY_FEATURE_SPEED_0);
}

#if defined(__MMI_VIDEO_PDL__) || defined(__MMI_VIDEO_STREAM__) 
/*****************************************************************************
 * FUNCTION
 *  jma_video_player_draw_progress_bar
 * DESCRIPTION
 *  This function is to draw progress bar 
 * PARAMETERS
 *  percentage          [IN] 
 * RETURNS
 *  void
 *****************************************************************************/
static void jma_video_player_draw_progress_bar(kal_int32 percentage)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 layer_width, layer_height;
    kal_int32 bar_x, bar_y, bar_width, bar_height, current_progress;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    ASSERT(preview_layer_handle != NULL);
    gdi_layer_push_and_set_active(preview_layer_handle);
    gdi_layer_get_dimension(&layer_width, &layer_height);
    gdi_layer_pop_and_restore_active();
    bar_width = layer_width * 2 / 3;
    bar_height = (bar_width / 10);
    bar_height = (bar_height > 5) ? bar_height : 5;
    ASSERT(bar_width != 0 && bar_height != 0);
    bar_x = (layer_width - bar_width) / 2;
    bar_y = (layer_height - bar_height) / 2;    
    current_progress = bar_width * percentage / 100;
    
    gdi_layer_push_and_set_active(preview_layer_handle);
    gdi_draw_solid_rect(bar_x, bar_y, bar_x + bar_width - 1, bar_y + bar_height - 1, GDI_COLOR_BLACK);
    gdi_draw_solid_rect(bar_x, bar_y, bar_x + current_progress - 1, bar_y + bar_height - 1, GDI_COLOR_WHITE);
    gdi_draw_rect(bar_x, bar_y, bar_x + bar_width - 1, bar_y + bar_height - 1, GDI_COLOR_WHITE);
    gdi_draw_rect(bar_x + 1, bar_y + 1, bar_x + bar_width - 2, bar_y + bar_height - 2, GDI_COLOR_BLACK);
    gdi_layer_pop_and_restore_active();
    
    jui_widget_refresh_screen(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);
}
#endif

#ifdef __MMI_VIDEO_PDL__ 
/*****************************************************************************
 * FUNCTION
 *  jma_video_player_cache_open_done_hdlr
 * DESCRIPTION
 *  This function is progressive player open done handler
 * PARAMETERS
 *         
 * RETURNS
 *  kal_bool - result
 *****************************************************************************/
void jma_video_player_cache_open_done_hdlr(MDI_RESULT result, mdi_video_info_struct *vdo_clip)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    MDI_RESULT ms;
    kal_uint64 max_time;
    
    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_PLAYER_CACHE_OPEN_DONE_HDLR, result, video_player.state);
    JMA_CS_ENTER(JMA_VOID);
    /* Error happens */
    if (result < 0)
    {
        jma_video_player_close(0, video_player.id);
        JMA_CS_LEAVE(JMA_VOID);
    }

    /* MED would set mute when play dummy audio for pure video */
    jam_set_aud_volume_level(jam_get_aud_volume_level()); 
     
    /* 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);
    
    video_player.video_width = vdo_clip->width;
    video_player.video_height = vdo_clip->height;
    video_player.duration = vdo_clip->total_time_duration;
    video_player.track = vdo_clip->track;
    kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_DD, vdo_clip->total_time_duration, vdo_clip->track);

    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);
   
        
    /* Avoid user seeks over max_time when video is at opening state */
    mdi_video_progressive_get_max_play_time(&max_time);
    if (video_player.current_time > max_time)   
    {
        kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_DD, video_player.current_time, max_time);
        video_player.current_time = max_time;
    }

    /* Video player is at READY state or pure-audio */
    if (preview_layer_handle == NULL || video_player.track == MDI_VIDEO_TRACK_A_ONLY)
    {
        kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_READY);
        video_player.state = JAVA_MEDIA_STATE_READY;  
        /* Need to seek before calling play: cannot reset current if resume from MMI interrupt */
        ms = mdi_video_ply_seek(video_player.current_time);
        video_player.seek_error = (ms == MED_RES_OK)? KAL_FALSE : KAL_TRUE;
    }
    else
    {
        kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_PAUSED);
        video_player.state = JAVA_MEDIA_STATE_PAUSED; 
        
        /* Seek to suspended time and Draw the 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);       
    }
    
    /* For resume from MMI interrupt */
    if (video_player.stoptime != -1)
    {
        mdi_video_ply_set_stop_time(video_player.stoptime);
    }
    
    if (video_player.is_play_requested)
    {
        jma_video_player_play(MMA_TYPE_MPEG, video_player.id);
    }         
    JMA_CS_LEAVE(JMA_VOID);
}


/*****************************************************************************
 * FUNCTION
 *  jma_video_player_cache_buffering_cyclic
 * DESCRIPTION
 *  This function is buffering cyclic handler 
 * PARAMETERS
 *  result          [IN] 
 *  video_clip      [IN]
 * RETURNS
 *  void
 *****************************************************************************/
kal_bool jma_video_player_cache_buffering_cyclic(void)
{
    /*--------

⌨️ 快捷键说明

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