From a785de0806c0d67cf7f7c6307a7194aaaac88b75 Mon Sep 17 00:00:00 2001 From: Praveen Chavan Date: Fri, 13 Sep 2013 15:47:55 -0700 Subject: mm-video: vidc: Flush m_input_free_q when input buffers are freed Not flushing it can leave dangling pointers to old input buffers, which get dereferenced if the component is re-used for another session. author: Deva Ramasubramanian bug: 10668205 Change-Id: I8356c7db9714d1c1d420d975aed0a7f50cdedef7 --- mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp index 521a2a44..bb2e6df9 100755 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp @@ -7210,6 +7210,12 @@ void omx_vdec::free_input_buffer_header() free (m_inp_mem_ptr); m_inp_mem_ptr = NULL; } + /* We just freed all the buffer headers, every thing in m_input_free_q + * is now invalid */ + while (m_input_free_q.m_size) { + unsigned address, p2, id; + m_input_free_q.pop_entry(&address, &p2, &id); + } if (drv_ctx.ptr_inputbuffer) { DEBUG_PRINT_LOW("\n Free Driver Context pointer"); free (drv_ctx.ptr_inputbuffer); -- cgit v1.2.3 From 7f118f5eb5d8dfd69600a8bb3c613056a234f85c Mon Sep 17 00:00:00 2001 From: Praveen Chavan Date: Fri, 13 Sep 2013 15:51:03 -0700 Subject: mm-video: Free frame_parser in component de-init frame_parser is alloc'ed in component init, it should be accordingly freed in de-init rather than when input buffers are freed. author: Leena Winterrowd Bug: 10668205 Change-Id: I2a8dd90b4831f9d9e7d50f5a1093d1a0055d3aad --- mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp index bb2e6df9..2bc8b595 100755 --- a/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp +++ b/mm-video-v4l2/vidc/vdec/src/omx_vdec_msm8974.cpp @@ -5664,6 +5664,12 @@ OMX_ERRORTYPE omx_vdec::component_deinit(OMX_IN OMX_HANDLETYPE hComp) h264_parser = NULL; } + if (m_frame_parser.mutils) { + DEBUG_PRINT_LOW("\n Free utils parser"); + delete (m_frame_parser.mutils); + m_frame_parser.mutils = NULL; + } + if (m_platform_list) { free(m_platform_list); m_platform_list = NULL; @@ -7187,12 +7193,6 @@ void omx_vdec::free_input_buffer_header() { input_use_buffer = false; if (arbitrary_bytes) { - if (m_frame_parser.mutils) { - DEBUG_PRINT_LOW("\n Free utils parser"); - delete (m_frame_parser.mutils); - m_frame_parser.mutils = NULL; - } - if (m_inp_heap_ptr) { DEBUG_PRINT_LOW("\n Free input Heap Pointer"); free (m_inp_heap_ptr); -- cgit v1.2.3 From db852782c64fa602ba4ad09d93d4e982373b857d Mon Sep 17 00:00:00 2001 From: Praveen Chavan Date: Fri, 13 Sep 2013 15:55:06 -0700 Subject: mm-video: vidc: Fix frameparser behavior on EOS with data The frameparser currently holds back any bytes that may be part of the next frame's start code. In general, this results in frames ending in 0x00 or 0x00,0x00 being marked as partial and properly flushed on the next parse_sc_frame call. If an EOS is received with data, this flush never occurs. In that case, this change copies the missing bytes to the destination frame. author: Leena Winterrowd Bug: 10668205 Change-Id: Ia7f1d795b2459da86f1bf6cdb5f8ca8e21c306bd --- mm-video-v4l2/vidc/vdec/src/frameparser.cpp | 51 ++++++++++++----------------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/mm-video-v4l2/vidc/vdec/src/frameparser.cpp b/mm-video-v4l2/vidc/vdec/src/frameparser.cpp index 2dd9d4e8..c17bd499 100755 --- a/mm-video-v4l2/vidc/vdec/src/frameparser.cpp +++ b/mm-video-v4l2/vidc/vdec/src/frameparser.cpp @@ -427,55 +427,41 @@ int frame_parse::parse_sc_frame ( OMX_BUFFERHEADERTYPE *source, /*Exit State Machine*/ psource = source->pBuffer + source->nOffset; - + int bytes_to_skip = 0; switch (parse_state) { case A5: *partialframe = 0; check_skip_frame_boundary(partialframe); - - if (parsed_length > 3) { - memcpy (pdest,psource,(parsed_length-3)); - dest->nFilledLen += (parsed_length-3); - } - + bytes_to_skip = 3; break; case A4: *partialframe = 0; check_skip_frame_boundary(partialframe); - - if (parsed_length > 4) { - memcpy (pdest,psource,(parsed_length-4)); - dest->nFilledLen += (parsed_length-4); - } - + bytes_to_skip = 4; break; case A3: - - if (parsed_length > 3) { - memcpy (pdest,psource,(parsed_length-3)); - dest->nFilledLen += (parsed_length-3); + if (source->nFlags & OMX_BUFFERFLAG_EOS) { + bytes_to_skip = 0; + } else { + bytes_to_skip = 3; } - break; case A2: - - if (parsed_length > 2) { - memcpy (pdest,psource,(parsed_length-2)); - dest->nFilledLen += (parsed_length-2); + if (source->nFlags & OMX_BUFFERFLAG_EOS) { + bytes_to_skip = 0; + } else { + bytes_to_skip = 2; } - break; case A1: - - if (parsed_length > 1) { - memcpy (pdest,psource,(parsed_length-1)); - dest->nFilledLen += (parsed_length-1); + if (source->nFlags & OMX_BUFFERFLAG_EOS) { + bytes_to_skip = 0; + } else { + bytes_to_skip = 1; } - break; case A0: - memcpy (pdest,psource,(parsed_length)); - dest->nFilledLen += (parsed_length); + bytes_to_skip = 0; break; } @@ -484,6 +470,11 @@ int frame_parse::parse_sc_frame ( OMX_BUFFERHEADERTYPE *source, return -1; } + if (parsed_length > bytes_to_skip) { + memcpy (pdest, psource, (parsed_length-bytes_to_skip)); + dest->nFilledLen += (parsed_length-bytes_to_skip); + } + source->nFilledLen -= parsed_length; source->nOffset += parsed_length; -- cgit v1.2.3