diff options
Diffstat (limited to 'mm-video-v4l2/vidc/venc/src')
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp | 57 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/omx_video_base.cpp | 4 | ||||
-rw-r--r-- | mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp | 37 |
3 files changed, 81 insertions, 17 deletions
diff --git a/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp b/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp index e1082978..e2e52e1f 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp @@ -2326,30 +2326,69 @@ SWVENC_STATUS omx_venc::swvenc_empty_buffer_done_cb { ENTER_FUNC(); + (void)swvenc; + SWVENC_STATUS eRet = SWVENC_S_SUCCESS; + omx_venc *omx = reinterpret_cast<omx_venc*>(p_client); + + if (p_ipbuffer == NULL) + { + eRet = SWVENC_S_FAILURE; + } + else + { + omx->swvenc_empty_buffer_done(p_ipbuffer); + } + return eRet; +} + +SWVENC_STATUS omx_venc::swvenc_empty_buffer_done +( + SWVENC_IPBUFFER *p_ipbuffer +) +{ SWVENC_STATUS eRet = SWVENC_S_SUCCESS; OMX_ERRORTYPE error = OMX_ErrorNone; OMX_BUFFERHEADERTYPE* omxhdr = NULL; - omx_video *omx = reinterpret_cast<omx_video*>(p_client); - - (void)swvenc; + //omx_video *omx = reinterpret_cast<omx_video*>(p_client); omxhdr = (OMX_BUFFERHEADERTYPE*)p_ipbuffer->p_client_data; DEBUG_PRINT_LOW("EBD: clientData (%p)", p_ipbuffer->p_client_data); if ( (omxhdr == NULL) || - ( ((OMX_U32)(omxhdr - omx->m_inp_mem_ptr) > omx->m_sInPortDef.nBufferCountActual) && - ((OMX_U32)(omxhdr - omx->meta_buffer_hdr) > omx->m_sInPortDef.nBufferCountActual) + ( ((OMX_U32)(omxhdr - m_inp_mem_ptr) >m_sInPortDef.nBufferCountActual) && + ((OMX_U32)(omxhdr - meta_buffer_hdr) >m_sInPortDef.nBufferCountActual) ) ) { omxhdr = NULL; error = OMX_ErrorUndefined; } - - omx->omx_release_meta_buffer(omxhdr); - - omx->post_event ((unsigned long)omxhdr,error,OMX_COMPONENT_GENERATE_EBD); + // unmap the input buffer->pBuffer + omx_release_meta_buffer(omxhdr); +#ifdef _ANDROID_ICS_ + if (meta_mode_enable) + { + encoder_media_buffer_type *meta_buf = NULL; + unsigned int size = 0; + meta_buf = (encoder_media_buffer_type *)omxhdr->pBuffer; + if (meta_buf) + { + if (meta_buf->buffer_type == kMetadataBufferTypeCameraSource) + { + size = meta_buf->meta_handle->data[2]; + } + else if (meta_buf->buffer_type == kMetadataBufferTypeGrallocSource) + { + private_handle_t *handle = (private_handle_t *)meta_buf->meta_handle; + size = handle->size; + } + } + int status = munmap(p_ipbuffer->p_buffer, size); + DEBUG_PRINT_HIGH("Unmapped pBuffer <%p> size <%d> status <%d>", p_ipbuffer->p_buffer, size, status); + } +#endif + post_event ((unsigned long)omxhdr,error,OMX_COMPONENT_GENERATE_EBD); RETURN(eRet); } diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp index 875c7955..fb49db2b 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -4121,7 +4121,7 @@ void omx_video::complete_pending_buffer_done_cbs() } } -#ifdef MAX_RES_720P +#if defined(MAX_RES_720P) || defined(_MSM8909_) OMX_ERRORTYPE omx_video::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) { OMX_ERRORTYPE eRet = OMX_ErrorNone; @@ -4174,7 +4174,7 @@ OMX_ERRORTYPE omx_video::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVE } #endif -#ifdef MAX_RES_1080P +#if defined(MAX_RES_1080P) && !defined(_MSM8909_) OMX_ERRORTYPE omx_video::get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType) { OMX_ERRORTYPE eRet = OMX_ErrorNone; diff --git a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp index 5dcaebf5..d4cf21c1 100644 --- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp +++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp @@ -56,8 +56,8 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define MPEG4_ASP_START (MPEG4_SP_START + 10) #define H263_BP_START 0 #define H264_BP_START 0 -#define H264_HP_START (H264_BP_START + 17) -#define H264_MP_START (H264_BP_START + 34) +#define H264_HP_START (H264_BP_START + 18) +#define H264_MP_START (H264_BP_START + 36) #define HEVC_MAIN_START 0 #define HEVC_MAIN10_START (HEVC_MAIN_START + 12) #define POLL_TIMEOUT 1000 @@ -66,6 +66,8 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SZ_4K 0x1000 #define SZ_1M 0x100000 +#define METADATA_INPUT_BUFFER_COUNT 5 + /* MPEG4 profile and level table*/ static const unsigned int mpeg4_profile_level_table[][MAX_PROFILE_PARAMS]= { /*max mb per frame, max mb per sec, max bitrate, level, profile, dpbmbs*/ @@ -284,10 +286,12 @@ void* venc_dev::async_venc_message_thread (void *input) struct pollfd pfd; struct v4l2_buffer v4l2_buf; struct v4l2_event dqevent; + struct statistics stats; pfd.events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI; pfd.fd = omx->handle->m_nDriver_fd; int error_code = 0,rc=0; + memset(&stats, 0, sizeof(statistics)); memset(&v4l2_buf, 0, sizeof(v4l2_buf)); while (1) { @@ -315,6 +319,7 @@ void* venc_dev::async_venc_message_thread (void *input) pthread_mutex_unlock(&omx->handle->pause_resume_mlock); break; } + memset(&stats, 0, sizeof(statistics)); } pthread_mutex_unlock(&omx->handle->pause_resume_mlock); @@ -370,6 +375,7 @@ void* venc_dev::async_venc_message_thread (void *input) venc_msg.buf.flags |= OMX_BUFFERFLAG_ENDOFFRAME; omx->handle->fbd++; + stats.bytes_generated += venc_msg.buf.len; if (omx->async_message_process(input,&venc_msg) < 0) { DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message"); @@ -444,6 +450,25 @@ void* venc_dev::async_venc_message_thread (void *input) } } } + + /* calc avg. fps, bitrate */ + struct timeval tv; + gettimeofday(&tv,NULL); + OMX_U64 time_diff = (OMX_U32)((tv.tv_sec * 1000000 + tv.tv_usec) - + (stats.prev_tv.tv_sec * 1000000 + stats.prev_tv.tv_usec)); + if (time_diff >= 5000000) { + if (stats.prev_tv.tv_sec) { + OMX_U32 num_fbd = omx->handle->fbd - stats.prev_fbd; + float framerate = num_fbd * 1000000/(float)time_diff; + OMX_U32 bitrate = (stats.bytes_generated * 8/num_fbd) * framerate; + DEBUG_PRINT_HIGH("stats: avg. fps %0.2f, bitrate %d", + framerate, bitrate); + } + stats.prev_tv = tv; + stats.bytes_generated = 0; + stats.prev_fbd = omx->handle->fbd; + } + } DEBUG_PRINT_HIGH("omx_venc: Async Thread exit"); @@ -1169,10 +1194,10 @@ bool venc_dev::venc_get_buf_req(OMX_U32 *min_buff_count, // Increase buffer-header count for metadata-mode on input port // to improve buffering and reduce bottlenecks in clients - if (metadatamode && (bufreq.count < 9)) { - DEBUG_PRINT_LOW("FW returned buffer count = %d , overwriting with 16", - bufreq.count); - bufreq.count = 9; + if (metadatamode && (bufreq.count < METADATA_INPUT_BUFFER_COUNT)) { + DEBUG_PRINT_LOW("FW returned buffer count = %d , overwriting with %d", + bufreq.count, METADATA_INPUT_BUFFER_COUNT); + bufreq.count = METADATA_INPUT_BUFFER_COUNT; } bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; |