📄 video_enc_api.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* video_enc_api.c
*
* Project:
* --------
* MT6218B and MT6219
*
* Description:
* ------------
* This file defines encode APIs for media task
*
* Author:
* -------
* -------
*
*============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
****************************************************************************/
#ifdef MP4_CODEC
#include "drv_comm.h"
#include "med_status.h"
#include "visual_comm.h"
#include "fsal.h"
#include "mp4_parser.h"
#include "l1audio.h"
#include "lcd_if.h"
#include "rtc_sw.h"
#include "video_file_creator.h"
#include "bmd.h"
#include "video_enc_glb.h"
#include "video_dec_glb.h"
#include "video_glb.h"
#include "visualhisr.h"
#include "intrCtrl.h"
#include "video_hw.h"
#include "dma_hw.h"
#include "dma_sw.h"
#include "reg_base.h"
#include "drvpdn.h"
#include "cache_sw.h"
extern void MPEG4_ENC_HISR(void);
extern void MPEG4_ENC_LISR(void);
extern kal_uint8 video_isr_count;
extern kal_uint32 video_enc_trigger_limit;
extern kal_uint32 video_toal_save_bytes;
extern kal_bool video_enc_proc_race_check;
extern VIDEO_ENC_START_RECORD_STATE video_is_start_record;
#if ( (!defined(MT6219)) && (!defined(MT6226)) && (!defined(MT6227)) && (!defined(MT6226M)) )
static kal_uint32 SavedCacheCtrl;
#endif /*MT6228, MT6229, MT6230*/
Media_Format video_enc_audio_format;
kal_uint32 pause_current_time_stamp;
/*resume start or normal start*/
kal_bool video_enc_start_by_resume;
void (*audio_record_callback)(Media_Event event);
void video_encode_drv_pause_info_restore(void);
VIDEO_ENC_PAUSE_INFO video_enc_pause_info;
kal_uint32 video_enc_prev_time_value;
MEDIA_STATUS_CODE video_enc_open(kal_uint32 frame_width, kal_uint32 frame_height, kal_uint32 frame_count,
kal_bool resume)
{
kal_uint32 savedMask;
MEDIA_STATUS_CODE result;
video_toal_save_bytes = 0;
video_enc_trigger_limit = 0;
video_enc_proc_race_check = KAL_FALSE;
video_is_start_record = VIDEO_ENC_START_RECORD_STATE_STOP;
#if ( (!defined(MT6219)) && (!defined(MT6226)) && (!defined(MT6227)) && (!defined(MT6226M)) )
SavedCacheCtrl = Lock2WaysForMPEG4();
#endif /*MT6228, MT6229, MT6230*/
savedMask = SaveAndSetIRQMask();
DRV_Reg(DRVPDN_CON3) &= ~(DRVPDN_CON3_MP4 | DRVPDN_CON3_DCT | DRVPDN_CON3_JPEG);
RestoreIRQMask(savedMask);
#ifdef __VIDEO_GET_YUV_DATA__
{
kal_wchar out_name[16] = L"x:\\isp.yuv";
out_name[0] = FS_GetDrive(FS_DRIVE_V_NORMAL, 1, FS_NO_ALT_DRIVE);/
/*out_name[0] = FS_GetDrive(FS_DRIVE_V_REMOVABLE, 1, FS_NO_ALT_DRIVE);*/
if ((frame_width * frame_height) > (176 * 144))
{
video_yuv.cif_size = 1;
video_yuv.yuv_max_buffer_count = VIDEO_YUV_MAX_BUFFER;
}
else
{
video_yuv.cif_size = 0;
video_yuv.yuv_max_buffer_count = VIDEO_YUV_MAX_BUFFER * 4;
}
g_video_enc_status.FSAL_STATUS = FSAL_Open(&video_yuv.MEDIA_YUV_FILE, out_name, FSAL_WRITE);
ASSERT(g_video_enc_status.FSAL_STATUS == FSAL_OK);
}
#endif /*__VIDEO_GET_YUV_DATA__*/
mpeg4_enc_reset();
VISUAL_Register_HISR(VISUAL_MPEG4_ENC_HISR_ID, MPEG4_ENC_HISR);
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
g_video_dec_info_ptr = NULL;
#else /*!(MT6219, MT6226, MT6227, MT6226M)*/
if (g_video_dec_status.running == KAL_FALSE)
mpeg4_core_reset();
#endif /*MT6219, MT6226, MT6227, MT6226M*/
g_video_enc_status.running = KAL_TRUE;
if (resume == KAL_FALSE)
{
kal_uint32 index;
#if defined(__VIDEO_EDITOR__)
if ((g_video_enc_status.scenario == VIDEO_SCENARIO_EDITOR) && (VIDEO_EDITOR_DATA.call_by_next == KAL_FALSE))
#endif
{
g_video_enc_info_ptr = (VIDEO_ENC_STRUCT *)extmem_get_buffer(sizeof(VIDEO_ENC_STRUCT));
#if defined(__VIDEO_EDITOR__)
if (g_video_enc_status.scenario == VIDEO_SCENARIO_EDITOR)
{
for (index = 0; index < VIDEO_ENC_MAX_BUFFER_COUNT; index++)
{
g_video_enc_info_ptr->VIDEO_ENC_BUFFER[index].buffer = (kal_uint8 *)extmem_get_buffer(
VIDEO_EDITOR_ENC_BUFFER_SIZE);
g_video_enc_info_ptr->VIDEO_ENC_BUFFER[index].buffer_length = VIDEO_EDITOR_ENC_BUFFER_SIZE;
}
}
else
#endif /*__VIDEO_EDITOR__*/
{
for (index = 0; index < VIDEO_ENC_MAX_BUFFER_COUNT; index++)
{
g_video_enc_info_ptr->VIDEO_ENC_BUFFER[index].buffer = (kal_uint8 *)
extmem_get_buffer(VIDEO_ENC_BUFFER_SIZE);
g_video_enc_info_ptr->VIDEO_ENC_BUFFER[index].buffer_length = VIDEO_ENC_BUFFER_SIZE;
}
}
video_enc_resource_init(frame_width, frame_height);
}
}
result = mp4_enc_struct_init(g_video_enc_info_ptr, MMFILE_MP4, frame_count);
if (result != MEDIA_STATUS_OK)
{
VIDEO_ASSERT(0);
return result;
}
video_isr_count = 0;
savedMask = SaveAndSetIRQMask();
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
IRQ_Register_LISR(IRQ_MPEG4_CODE, MPEG4_ENC_LISR, "MPEG4");
IRQSensitivity(IRQ_MPEG4_CODE, LEVEL_SENSITIVE);
IRQUnmask(IRQ_MPEG4_CODE);
#else /*!(MT6219, MT6226, MT6227, MT6226M)*/
IRQ_Register_LISR(IRQ_MPEG4_ENC_CODE, MPEG4_ENC_LISR, "MPEG4");
IRQSensitivity(IRQ_MPEG4_ENC_CODE, LEVEL_SENSITIVE);
IRQUnmask(IRQ_MPEG4_ENC_CODE);
#endif /*(MT6219, MT6226, MT6227, MT6226M)*/
RestoreIRQMask(savedMask);
g_video_enc_info_ptr->stage = VIDEO_ENC_STAGE_OPEN;
return MEDIA_STATUS_OK;
}
void video_enc_stop_record(void)
{
g_video_enc_info_ptr->encode_stop = KAL_TRUE;
}
void video_enc_close(void)
{
kal_uint32 savedMask;
kal_uint8 check_count;
/*To guarantee at least one frame*/
for (check_count = 0; check_count < 15; check_count++)
{
if (g_video_enc_info_ptr->hisr_total_frames > 1)
break;
else
kal_sleep_task(6);
}
g_video_enc_info_ptr->encode_stop = KAL_TRUE;
mpeg4_enc_wait_done();
#if ( defined(MT6219) || defined(MT6226) || defined(MT6227) || defined(MT6226M) )
IRQMask(IRQ_MPEG4_CODE);
#else /*!(MT6219, MT6226, MT6227, MT6226M)*/
IRQMask(IRQ_MPEG4_ENC_CODE);
#endif /*(MT6219, MT6226, MT6227, MT6226M)*/
mpeg4_enc_reset();
#if ( (!defined(MT6219)) && (!defined(MT6226)) && (!defined(MT6227)) && (!defined(MT6226M)) )
if (g_video_dec_status.running == KAL_FALSE)
mpeg4_core_reset();
#endif /*!(MT6219, MT6226, MT6227, MT6226M)*/
savedMask = SaveAndSetIRQMask();
DRV_Reg(DRVPDN_CON3) |= (DRVPDN_CON3_MP4 | DRVPDN_CON3_DCT | DRVPDN_CON3_JPEG);
RestoreIRQMask(savedMask);
video_enc_audio_format = 0;
g_video_enc_info_ptr->stage = VIDEO_ENC_STAGE_CLOSE;
#if ( (!defined(MT6219)) && (!defined(MT6226)) && (!defined(MT6227)) && (!defined(MT6226M)) )
Unlock2WaysForMPEG4(SavedCacheCtrl);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -