summaryrefslogtreecommitdiffstats
path: root/mm-video-v4l2/vidc/venc/src
diff options
context:
space:
mode:
Diffstat (limited to 'mm-video-v4l2/vidc/venc/src')
-rw-r--r--mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp57
-rw-r--r--mm-video-v4l2/vidc/venc/src/omx_video_base.cpp4
-rw-r--r--mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp37
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;