📄 jma_video_recorder.c
字号:
/*****************************************************************************
* FUNCTION
* jma_video_recorder_save_file
* DESCRIPTION
* / mmi_vdorec_entry_saving_screen
* enter save screen
* PARAMETERS
* native_recorder [IN]
* RETURNS
* void
*****************************************************************************/
void jma_video_recorder_save_file(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
MDI_RESULT result;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_RECORDER_SAVE_FILE, video_player.id, video_player.state);
JMA_CS_ENTER(JMA_VOID);
/* if unsaved file exist, merge them */
if (mdi_video_rec_has_unsaved_file(NULL))
{
video_record_need_merge = KAL_TRUE;
result = mdi_video_rec_save_file(NULL, jma_video_recorder_save_result_hdlr);
/* if error occurs, delete file */
if (result != MDI_RES_VDOREC_SUCCEED)
{
mdi_video_rec_delete_unsaved_file(NULL);
}
}
JMA_CS_LEAVE(JMA_VOID);
}
/*****************************************************************************
* FUNCTION
* jma_video_recorder_record_result_hdlr
* DESCRIPTION
* The function is invoked when record size limit is reached or error occurs,
* such as disk full,....
* PARAMETERS
* result [IN]
* a(?) [IN] Current state
* RETURNS
* void
*****************************************************************************/
void jma_video_recorder_record_result_hdlr(MDI_RESULT result)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_int32 recorder;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_RECORDER_RECORD_RESULT_HDLR, video_player.id, video_player.state, result);
JMA_CS_ENTER(JMA_VOID);
/* get record time */
mdi_video_rec_get_cur_record_time(&video_player.current_time);
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_D, (int) video_player.current_time);
/* free layers */
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);
}
/* MED recorder stopped, JAL has not saved file yet */
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;
if (result == MDI_RES_VDOREC_DISK_FULL)
{
jma_video_recorder_commit(MMA_TYPE_MPEG, video_player.id);
jvm_post_mma_event(MMA_EVENT_RECORD_STOPPED,
(kal_int16) video_player.id, video_player.current_time);
}
else /* Error case */
{
recorder = video_player.id;
jma_video_recorder_close(MMA_TYPE_MPEG, recorder);
jvm_post_mma_event(MMA_EVENT_RECORD_ERROR, (kal_int16) recorder, (kal_int64) MMA_ERR_RECORD_FAIL);
}
JMA_CS_LEAVE(JMA_VOID);
}
/*****************************************************************************
* FUNCTION
* jma_video_recorder_save_result_hdlr
* DESCRIPTION
* / jma_mpeg_recorder_save_result_hdlr_callback
* callback function when save is done
* PARAMETERS
* result [IN]
* RETURNS
* void
*****************************************************************************/
void jma_video_recorder_save_result_hdlr(MDI_RESULT result)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_int32 recorder;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_RECORDER_SAVE_RESULT_HDLR, video_player.id, video_player.state, result);
JMA_CS_ENTER(JMA_VOID);
/* Reset parameter */
video_record_need_merge = KAL_FALSE;
/* if error occurs, delete file */
if (result != MDI_RES_VDOREC_SUCCEED)
{
recorder = video_player.id;
jma_video_recorder_close(MMA_TYPE_MPEG, recorder);
jvm_post_mma_event(MMA_EVENT_RECORD_ERROR, (kal_int16) recorder, (kal_int64) MMA_ERR_RECORD_FAIL);
}
JMA_CS_LEAVE(JMA_VOID);
}
/*****************************************************************************
* FUNCTION
* jma_video_recorder_open
* DESCRIPTION
* This function allocate mpeg recorder context and open file for recording
* PARAMETERS
* mma_type [IN]
* java_player [IN]
* filename [?]
* mode [IN]
* RETURNS
* int - 0
*****************************************************************************/
kal_bool jma_video_recorder_open(kal_int32 mma_type, kal_int32 java_player)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
MDI_RESULT result;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_RECORDER_OPEN, java_player);
JMA_CS_ENTER(KAL_FALSE);
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);
}
gdi_layer_reset_clip();
gdi_layer_reset_text_clip();
/* Check if Bluetooth is in use now */
#ifdef __MMI_FTS_SUPPORT__
if (mmi_ftp_server_is_receiving())
{
j2me_send_not_found(BT_IN_USE);
JMA_CS_LEAVE(KAL_FALSE);
}
#endif
#ifdef __MMI_OPP_SUPPORT__
if (mmi_opp_is_receiving())
{
j2me_send_not_found(BT_IN_USE);
JMA_CS_LEAVE(KAL_FALSE);
}
#endif
if (mdi_video_rec_has_unsaved_file(NULL) == TRUE)
{
/* residue temp files exist, cleaning needed! */
mdi_video_rec_delete_unsaved_file(NULL);
}
if (video_player.state == JAVA_MEDIA_STATE_NULL)
{
/* Backlight control */
jvm_force_backlight_on(KAL_TRUE);
/* camera HW power on */
result = mdi_video_rec_power_on();
if (result == MDI_RES_VDOREC_SUCCEED)
{
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.current_time = 0;
video_player.device_type = JAVA_MEDIA_MPEG_RECORDER_DEVICE;
kal_trace(TRACE_GROUP_4, INFO_J2ME_MMA_START_DOUBLE_BUFFER);
jui_widget_start_double_buffer();
video_player.is_double_buffer = KAL_TRUE;
jma_register_device(
JAVA_MEDIA_MPEG_RECORDER_DEVICE,
java_player,
&jma_video_recorder_suspend_hdlr,
&jma_video_recorder_resume_hdlr,
&jma_video_recorder_close_hdlr);
JMA_CS_LEAVE(KAL_TRUE);
}
else
{
/* Resume MMI Background Audio */
mdi_audio_resume_background_play();
JMA_CS_LEAVE(KAL_FALSE);
}
}
JMA_CS_LEAVE(KAL_TRUE);
}
/*****************************************************************************
* FUNCTION
* jma_video_recorder_close
* DESCRIPTION
* If the function is called before commit(), it will erase recording material.
* PARAMETERS
* mma_type [IN] Int recorder
* java_player [IN]
* RETURNS
* kal_bool - true
*****************************************************************************/
kal_bool jma_video_recorder_close(kal_int32 mma_type, kal_int32 java_player)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_RECORDER_CLOSE, 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_RECORDING ||
video_player.state == JAVA_MEDIA_STATE_PAUSED ||
video_player.state == JAVA_MEDIA_STATE_STOPPED_PAUSED)
{
/* State will be changed to READY */
jma_video_recorder_reset(mma_type, java_player);
}
if (video_player.state == JAVA_MEDIA_STATE_PLAYING)
{
jma_video_recorder_stop_preview(mma_type, java_player);
}
if (video_player.state == JAVA_MEDIA_STATE_READY)
{
/* Camera power off */
mdi_video_rec_power_off();
}
jma_deregister_device(JAVA_MEDIA_MPEG_RECORDER_DEVICE, java_player);
kal_trace(TRACE_GROUP_4, J2ME_MMA_STATE_TRANSITION, video_player.state, JAVA_MEDIA_STATE_NULL);
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();
video_record_need_merge = KAL_FALSE;
/* Backlight control */
jvm_force_backlight_on(KAL_FALSE);
/* Resume MMI Background Audio */
mdi_audio_resume_background_play();
JMA_CS_LEAVE(KAL_TRUE);
}
/*****************************************************************************
* FUNCTION
* jma_mpeg_recorder_start_preview
* DESCRIPTION
* () / mmi_vdorec_start_preview()
* Start preview
* PARAMETERS
* native_recorder [IN]
* RETURNS
* void
*****************************************************************************/
kal_bool jma_video_recorder_start_preview(kal_int32 mma_type, kal_int32 java_player)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
mdi_video_setting_struct video_preview_data;
MDI_RESULT result;
kal_bool ret;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_trace(TRACE_GROUP_4, FUNC_J2ME_JMA_VIDEO_RECORDER_START_PREVIEW, 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);
}
/* preview */
video_preview_data.wb = MDI_VIDEO_WB_AUTO; /* vdorec_wb_command_map[g_vdorec_cntx.setting.wb]; */
video_preview_data.ev = MDI_VIDEO_EV_0; /* vdorec_ev_command_map[g_vdorec_cntx.setting.ev]; */
video_preview_data.banding = MDI_VIDEO_BANDING_60HZ; /* vdorec_banding_command_map[g_vdorec_cntx.setting.banding]; */
video_preview_data.effect = MDI_VIDEO_EFFECT_NOMRAL; /* vdorec_effect_command_map[g_vdorec_cntx.setting.effect]; */
video_preview_data.zoom = 10; /* VDOREC_FEATURE_ZOOM_0; //jma_mpeg_recorder_get_zoom_factor(); */
video_preview_data.brightness = 128;
video_preview_data.contrast = 128;
video_preview_data.saturation = 128;
video_preview_data.hue = 0;
video_preview_data.preview_rotate = J2ME_PREVIEW_MAINLCD_ROTATE; //MDI_CAMERA_PREVIEW_ROTATE_0;
#ifdef HORIZONTAL_CAMERA
video_preview_data.lcm_rotate = MDI_CAMERA_LCM_ROTATE_270;
#else
video_preview_data.lcm_rotate = MDI_CAMERA_LCM_ROTATE_0;
#endif
video_preview_data.night = 0; /* VDOREC_SETTING_NIGHT_OFF; //g_mpgrec_cntx.setting.night; */
/* record */
video_preview_data.video_size = MDI_VIDEO_VIDEO_SIZE_QCIF;
video_preview_data.video_qty = MDI_VIDEO_REC_QTY_NORMAL; /* dorec_video_qty_command_map[g_vdorec_cntx.setting.video_qty]; */
video_preview_data.size_limit = 0;
video_preview_data.time_limit = 0;
video_preview_data.record_aud = TRUE;
video_preview_data.video_format = VID_3GP_BIT_STREAM; /* vdorec_video_format_command_map[g_vdorec_cntx.setting.video_format]; */
/* preview & record */
video_preview_data.overlay_frame_mode = FALSE;
video_preview_data.overlay_frame_depth = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -