summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2015-01-21 13:57:39 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2015-01-21 13:57:39 -0800
commit8445212133cbf17621015a8befde24d02354e896 (patch)
tree3388f715d195b7af4927a686fabc51ba47caca90
parentdaca406595959f665e58968c769d03558e9555b8 (diff)
parent4ca6167559d1d85bf71802a570363d45703084ff (diff)
downloadandroid_hardware_qcom_media-8445212133cbf17621015a8befde24d02354e896.tar.gz
android_hardware_qcom_media-8445212133cbf17621015a8befde24d02354e896.tar.bz2
android_hardware_qcom_media-8445212133cbf17621015a8befde24d02354e896.zip
Merge "mm-video-v4l2: venc: measure framerate and bitrate statistics"
-rw-r--r--mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h6
-rw-r--r--mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp23
2 files changed, 29 insertions, 0 deletions
diff --git a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
index 0cbbbb27..ed79eb4c 100644
--- a/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
+++ b/mm-video-v4l2/vidc/venc/inc/video_encoder_device_v4l2.h
@@ -224,6 +224,12 @@ struct extradata_buffer_info {
#endif
};
+struct statistics {
+ struct timeval prev_tv;
+ int prev_fbd;
+ int bytes_generated;
+};
+
enum rc_modes {
RC_VBR_VFR = BIT(0),
RC_VBR_CFR = BIT(1),
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 e1fbafb1..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
@@ -286,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) {
@@ -317,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);
@@ -372,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");
@@ -446,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");