From f197cbf74453764bf6f0bd32b1c0b87ec2cb7502 Mon Sep 17 00:00:00 2001 From: Surajit Podder Date: Thu, 5 Oct 2017 13:51:40 +0530 Subject: mm-video-v4l2: vidc: Fix vp8, vp9 dumping logic. Add ivf file & frame headers while dumping vp8/vp9 compressed bitstream. CRs-Fixed: 2026709 Change-Id: Ibba149e1c6f21596972b0b8a03b859c8ecb5af91 --- mm-video-v4l2/vidc/common/inc/vidc_debug.h | 25 ++++++++++ mm-video-v4l2/vidc/common/src/vidc_common.cpp | 27 ++++++++++ mm-video-v4l2/vidc/vdec/inc/omx_vdec.h | 2 +- mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp | 57 +++++----------------- mm-video-v4l2/vidc/venc/inc/omx_swvenc_mpeg4.h | 2 +- mm-video-v4l2/vidc/venc/inc/omx_video_base.h | 2 +- mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h | 3 +- .../vidc/venc/inc/video_encoder_device_v4l2.h | 2 +- mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp | 3 +- mm-video-v4l2/vidc/venc/src/omx_video_base.cpp | 3 +- mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp | 5 +- .../vidc/venc/src/video_encoder_device_v4l2.cpp | 14 +++++- 12 files changed, 88 insertions(+), 57 deletions(-) mode change 100755 => 100644 mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp diff --git a/mm-video-v4l2/vidc/common/inc/vidc_debug.h b/mm-video-v4l2/vidc/common/inc/vidc_debug.h index 08425fd4..a220d550 100644 --- a/mm-video-v4l2/vidc/common/inc/vidc_debug.h +++ b/mm-video-v4l2/vidc/common/inc/vidc_debug.h @@ -200,6 +200,31 @@ public: } }; +struct __attribute__((packed)) IvfFileHeader { + uint8_t signature[4]; + uint16_t version; + uint16_t size; + uint8_t fourCC[4]; + uint16_t width; + uint16_t height; + uint32_t rate; + uint32_t scale; + uint32_t frameCount; + uint32_t unused; + + IvfFileHeader(); + IvfFileHeader(bool isVp9, int width, int height, + int rate, int scale, int nFrameCount); +}; + +struct __attribute__((packed)) IvfFrameHeader { + uint32_t filledLen; + uint64_t timeStamp; + + IvfFrameHeader(); + IvfFrameHeader(uint32_t size, uint64_t timeStamp); +}; + #define VIDC_TRACE_NAME_LOW(_name) AutoTracer _tracer(PRIO_TRACE_LOW, _name); #define VIDC_TRACE_NAME_HIGH(_name) AutoTracer _tracer(PRIO_TRACE_HIGH, _name); diff --git a/mm-video-v4l2/vidc/common/src/vidc_common.cpp b/mm-video-v4l2/vidc/common/src/vidc_common.cpp index d9c6e7e9..b3b73dad 100644 --- a/mm-video-v4l2/vidc/common/src/vidc_common.cpp +++ b/mm-video-v4l2/vidc/common/src/vidc_common.cpp @@ -308,3 +308,30 @@ bool profile_level_converter::convert_omx_level_to_v4l2(int codec, int omx_level return find_item(level_map, omx_level, v4l2_level); } + +IvfFileHeader:: IvfFileHeader() : + signature{'D','K','I','F'}, + version(), + size(32), + fourCC{'V','P','8','0'}, + unused() +{ +} + +IvfFileHeader:: IvfFileHeader(bool isVp9, int width, int height, + int rate, int scale, int frameCount) : + IvfFileHeader() { + this->width = width; + this->height = height; + this->rate = rate; + this->scale = scale; + this->frameCount = frameCount; + fourCC[2] = isVp9 ? '9' : '8'; +} + +IvfFrameHeader:: IvfFrameHeader(): filledLen(), timeStamp() {} + +IvfFrameHeader:: IvfFrameHeader(uint32_t filledLen, uint64_t timeStamp) : + filledLen(filledLen), + timeStamp(timeStamp) { +} diff --git a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h index cd75dd04..292bc498 100644 --- a/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h +++ b/mm-video-v4l2/vidc/vdec/inc/omx_vdec.h @@ -1272,7 +1272,7 @@ class omx_vdec: public qc_omx_component allocate_color_convert_buf client_buffers; struct video_decoder_capability m_decoder_capability; struct debug_cap m_debug; - int log_input_buffers(const char *, int); + int log_input_buffers(const char *, int, uint64_t); int log_output_buffers(OMX_BUFFERHEADERTYPE *); void send_codec_config(); OMX_TICKS m_last_rendered_TS; diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp index df898d3c..6e5ec906 100644 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_v4l2.cpp @@ -1915,7 +1915,7 @@ OMX_ERRORTYPE omx_vdec::is_video_session_supported() return OMX_ErrorNone; } -int omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len) +int omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len, uint64_t timeStamp) { if (m_debug.in_buffer_log && !m_debug.infile) { if(!strncmp(drv_ctx.kind,"OMX.qcom.video.decoder.mpeg2", OMX_MAX_STRINGNAME_SIZE)) { @@ -1947,55 +1947,20 @@ int omx_vdec::log_input_buffers(const char *buffer_addr, int buffer_len) } if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { - struct ivf_file_header { - OMX_U8 signature[4]; //='DKIF'; - OMX_U8 version ; //= 0; - OMX_U8 headersize ; //= 32; - OMX_U32 FourCC; - OMX_U8 width; - OMX_U8 height; - OMX_U32 rate; - OMX_U32 scale; - OMX_U32 length; - OMX_U8 unused[4]; - } file_header; - - memset((void *)&file_header,0,sizeof(file_header)); - file_header.signature[0] = 'D'; - file_header.signature[1] = 'K'; - file_header.signature[2] = 'I'; - file_header.signature[3] = 'F'; - file_header.version = 0; - file_header.headersize = 32; - switch (drv_ctx.decoder_format) { - case VDEC_CODECTYPE_VP8: - file_header.FourCC = 0x30385056; - break; - case VDEC_CODECTYPE_VP9: - file_header.FourCC = 0x30395056; - break; - default: - DEBUG_PRINT_ERROR("unsupported format for VP8/VP9"); - break; - } - fwrite((const char *)&file_header, - sizeof(file_header),1,m_debug.infile); + bool isVp9 = drv_ctx.decoder_format == VDEC_CODECTYPE_VP9; + int width = drv_ctx.video_resolution.frame_width; + int height = drv_ctx.video_resolution.frame_height; + int fps = drv_ctx.frame_rate.fps_numerator; + IvfFileHeader ivfHeader(isVp9, width, height, 1, fps, 0); + fwrite((const char *)&ivfHeader, + sizeof(ivfHeader),1,m_debug.infile); } } if (m_debug.infile && buffer_addr && buffer_len) { if (!strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp8", OMX_MAX_STRINGNAME_SIZE) || !strncmp(drv_ctx.kind, "OMX.qcom.video.decoder.vp9", OMX_MAX_STRINGNAME_SIZE)) { - struct vpx_ivf_frame_header { - OMX_U32 framesize; - OMX_U32 timestamp_lo; - OMX_U32 timestamp_hi; - } vpx_frame_header; - vpx_frame_header.framesize = buffer_len; - /* Currently FW doesn't use timestamp values */ - vpx_frame_header.timestamp_lo = 0; - vpx_frame_header.timestamp_hi = 0; - fwrite((const char *)&vpx_frame_header, - sizeof(vpx_frame_header),1,m_debug.infile); + IvfFrameHeader ivfFrameHeader(buffer_len, timeStamp); + fwrite(&ivfFrameHeader, sizeof(ivfFrameHeader), 1, m_debug.infile); } fwrite(buffer_addr, buffer_len, 1, m_debug.infile); } @@ -6911,7 +6876,7 @@ OMX_ERRORTYPE omx_vdec::empty_this_buffer_proxy(OMX_IN OMX_HANDLETYPE hComp, handle_demux_data(buffer); } - log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len); + log_input_buffers((const char *)temp_buffer->bufferaddr, temp_buffer->buffer_len, buffer->nTimeStamp); if (buffer->nFlags & QOMX_VIDEO_BUFFERFLAG_EOSEQ) { buffer->nFlags &= ~QOMX_VIDEO_BUFFERFLAG_EOSEQ; diff --git a/mm-video-v4l2/vidc/venc/inc/omx_swvenc_mpeg4.h b/mm-video-v4l2/vidc/venc/inc/omx_swvenc_mpeg4.h index 8625b4a4..aca9679a 100755 --- a/mm-video-v4l2/vidc/venc/inc/omx_swvenc_mpeg4.h +++ b/mm-video-v4l2/vidc/venc/inc/omx_swvenc_mpeg4.h @@ -161,7 +161,7 @@ class omx_venc: public omx_video bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, OMX_U32 height); bool dev_get_output_log_flag(); - int dev_output_log_buffers(const char *buffer_addr, int buffer_len); + int dev_output_log_buffers(const char *buffer_addr, int buffer_len, uint64_t timestamp); int dev_extradata_log_buffers(char *buffer); bool swvenc_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, OMX_U32 height); diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h index 88f8e1ea..aec5a349 100644 --- a/mm-video-v4l2/vidc/venc/inc/omx_video_base.h +++ b/mm-video-v4l2/vidc/venc/inc/omx_video_base.h @@ -305,7 +305,7 @@ class omx_video: public qc_omx_component virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, OMX_U32 height) = 0; virtual bool dev_get_output_log_flag() = 0; - virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len) = 0; + virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len, uint64_t timestamp) = 0; virtual int dev_extradata_log_buffers(char *buffer_addr) = 0; virtual bool dev_get_hevc_profile(OMX_U32*) = 0; OMX_ERRORTYPE component_role_enum( diff --git a/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h b/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h index aafb77e3..653b74dd 100644 --- a/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h +++ b/mm-video-v4l2/vidc/venc/inc/omx_video_encoder.h @@ -92,7 +92,8 @@ class omx_venc: public omx_video bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, OMX_U32 height); bool dev_get_output_log_flag(); - int dev_output_log_buffers(const char *buffer_addr, int buffer_len); + int dev_output_log_buffers(const char *buffer_addr, + int buffer_len, uint64_t timestamp); int dev_extradata_log_buffers(char *buffer); bool dev_get_hevc_profile(OMX_U32* profile); }; 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 f173f1e5..5a1ad498 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 @@ -353,7 +353,7 @@ class venc_dev OMX_ERRORTYPE venc_set_temporal_settings(OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE &temporalSettings); void venc_copy_temporal_settings(OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE &temporalSettings); bool venc_get_output_log_flag(); - int venc_output_log_buffers(const char *buffer_addr, int buffer_len); + int venc_output_log_buffers(const char *buffer_addr, int buffer_len, uint64_t timestamp); int venc_input_log_buffers(OMX_BUFFERHEADERTYPE *buffer, int fd, int plane_offset, unsigned long inputformat); int venc_extradata_log_buffers(char *buffer_addr); 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 92ca5425..d1c86565 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_swvenc_mpeg4.cpp @@ -2712,8 +2712,9 @@ bool omx_venc::dev_get_output_log_flag() RETURN(m_debug.out_buffer_log == 1); } -int omx_venc::dev_output_log_buffers(const char *buffer, int bufferlen) +int omx_venc::dev_output_log_buffers(const char *buffer, int bufferlen, uint64_t ts) { + (void) ts; ENTER_FUNC(); if (m_debug.out_buffer_log && !m_debug.outfile) 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 7083538c..a4652ee9 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_base.cpp @@ -4598,7 +4598,8 @@ OMX_ERRORTYPE omx_video::fill_buffer_done(OMX_HANDLETYPE hComp, m_fbd_count++; if (dev_get_output_log_flag()) { - dev_output_log_buffers((const char*)buffer->pBuffer + buffer->nOffset, buffer->nFilledLen); + dev_output_log_buffers((const char*)buffer->pBuffer + buffer->nOffset, buffer->nFilledLen, + buffer->nTimeStamp); } } if (buffer->nFlags & OMX_BUFFERFLAG_EXTRADATA) { diff --git a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp index 77aea7fc..b861c012 100644 --- a/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp +++ b/mm-video-v4l2/vidc/venc/src/omx_video_encoder.cpp @@ -2484,9 +2484,10 @@ bool omx_venc::dev_get_output_log_flag() return handle->venc_get_output_log_flag(); } -int omx_venc::dev_output_log_buffers(const char *buffer, int bufferlen) +int omx_venc::dev_output_log_buffers(const char *buffer, + int bufferlen, uint64_t timestamp) { - return handle->venc_output_log_buffers(buffer, bufferlen); + return handle->venc_output_log_buffers(buffer, bufferlen, timestamp); } int omx_venc::dev_extradata_log_buffers(char *buffer) 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 old mode 100755 new mode 100644 index 791cdb00..63514e7d --- a/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp +++ b/mm-video-v4l2/vidc/venc/src/video_encoder_device_v4l2.cpp @@ -1156,7 +1156,7 @@ bool venc_dev::venc_get_output_log_flag() return (m_debug.out_buffer_log == 1); } -int venc_dev::venc_output_log_buffers(const char *buffer_addr, int buffer_len) +int venc_dev::venc_output_log_buffers(const char *buffer_addr, int buffer_len, uint64_t timestamp) { if (venc_handle->is_secure_session()) { DEBUG_PRINT_ERROR("logging secure output buffers is not allowed!"); @@ -1186,8 +1186,18 @@ int venc_dev::venc_output_log_buffers(const char *buffer_addr, int buffer_len) m_debug.outfile_name[0] = '\0'; return -1; } + if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { + int fps = m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den; + IvfFileHeader ivfFileHeader(false, m_sVenc_cfg.input_width, + m_sVenc_cfg.input_height, fps, 1, 0); + fwrite(&ivfFileHeader, sizeof(ivfFileHeader), 1, m_debug.outfile); + } } if (m_debug.outfile && buffer_len) { + if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) { + IvfFrameHeader ivfFrameHeader(buffer_len, timestamp); + fwrite(&ivfFrameHeader, sizeof(ivfFrameHeader), 1, m_debug.outfile); + } DEBUG_PRINT_LOW("%s buffer_len:%d", __func__, buffer_len); fwrite(buffer_addr, buffer_len, 1, m_debug.outfile); } @@ -2176,7 +2186,7 @@ bool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index) if (!venc_set_inloop_filter(OMX_VIDEO_AVCLoopFilterEnable)) DEBUG_PRINT_HIGH("WARN: Request for setting Inloop filter failed for HEVC encoder"); - OMX_U32 fps = m_sVenc_cfg.fps_num ? m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den : 30; + OMX_U32 fps = m_sVenc_cfg.fps_den ? m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den : 30; OMX_U32 nPFrames = pParam->nKeyFrameInterval > 0 ? pParam->nKeyFrameInterval - 1 : fps - 1; if (!venc_set_intra_period (nPFrames, 0 /* nBFrames */)) { DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed"); -- cgit v1.2.3