diff --git a/linux-ramdump-parser-v2/parsers/vidc.py b/linux-ramdump-parser-v2/parsers/vidc.py
new file mode 100644
index 0000000000000000000000000000000000000000..c960559cd8827b24cb836a76c8a09f98a58b8e62
--- /dev/null
+++ b/linux-ramdump-parser-v2/parsers/vidc.py
@@ -0,0 +1,840 @@
+"""
+Copyright (c) 2017, The Linux Foundation. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of The Linux Foundation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+from parser_util import register_parser, RamParser
+import linux_list as llist
+
+@register_parser('--print-vidc',  'Print vidc driver information',  optional=True)
+class DumpVidc(RamParser):
+
+    def __init__(self, ramdump):
+        self.ramdump = ramdump
+        self.msg_dict = {
+            '0x00021001':'HFI_MSG_EVENT_NOTIFY',
+            '0x00021000':'HFI_MSG_SESSION_COMMON_START',
+            '0x00121001':'HFI_MSG_SESSION_DECODE_FRAME_DONE',
+            '0x00121000':'HFI_MSG_SESSION_DX_START',
+            '0x00221007':'HFI_MSG_SESSION_EMPTY_BUFFER_DONE',
+            '0x00121004':'HFI_MSG_SESSION_ENCODE_EOS_COMPLETE_DONE',
+            '0x00121003':'HFI_MSG_SESSION_ENCODE_FLUSH_DONE',
+            '0x00121002':'HFI_MSG_SESSION_ENCODE_FRAME_DONE',
+            '0x00221008':'HFI_MSG_SESSION_FILL_BUFFER_DONE',
+            '0x00221006':'HFI_MSG_SESSION_FLUSH_DONE',
+            '0x00021002':'HFI_MSG_SESSION_GET_SEQUENCE_HEADER_DONE',
+            '0x00221001':'HFI_MSG_SESSION_LOAD_RESOURCES_DONE',
+            '0x00221000':'HFI_MSG_SESSION_OX_START',
+            '0x0022100B':'HFI_MSG_SESSION_PARSE_SEQUENCE_HEADER_DONE',
+            '0x00221009':'HFI_MSG_SESSION_PROPERTY_INFO',
+            '0x0022100C':'HFI_MSG_SESSION_RELEASE_BUFFERS_DONE',
+            '0x0022100A':'HFI_MSG_SESSION_RELEASE_RESOURCES_DONE',
+            '0x00221005':'HFI_MSG_SESSION_RESUME_DONE',
+            '0x00221002':'HFI_MSG_SESSION_START_DONE',
+            '0x00221003':'HFI_MSG_SESSION_STOP_DONE',
+            '0x00221004':'HFI_MSG_SESSION_SUSPEND_DONE',
+            '0x0022100D':'HFI_MSG_SESSION_SYNC_DONE',
+            '0x00020000':'HFI_MSG_START_OFFSET',
+            '0x00020000':'HFI_MSG_SYS_COMMON_START',
+            '0x00020009':'HFI_MSG_SYS_COV',
+            '0x00020004':'HFI_MSG_SYS_DEBUG',
+            '0x00000100':'HFI_MSG_SYS_DEBUG_PACKET_MAX_STRNG_SIZE',
+            '0x00120000':'HFI_MSG_SYS_DX_START',
+            '0x00020008':'HFI_MSG_SYS_IDLE',
+            '0x00020001':'HFI_MSG_SYS_INIT_DONE',
+            '0x00220000':'HFI_MSG_SYS_OX_START',
+            '0x00020002':'HFI_MSG_SYS_PC_PREP_DONE',
+            '0x00220002':'HFI_MSG_SYS_PING_ACK',
+            '0x0002000A':'HFI_MSG_SYS_PROPERTY_INFO',
+            '0x00020003':'HFI_MSG_SYS_RELEASE_RESOURCE',
+            '0x00220004':'HFI_MSG_SYS_SESSION_ABORT_DONE',
+            '0x00020007':'HFI_MSG_SYS_SESSION_END_DONE',
+            '0x00020006':'HFI_MSG_SYS_SESSION_INIT_DONE'
+        }
+        self.cmd_dict = {
+            '0x00011000':'HFI_CMD_SESSION_COMMON_START',
+            '0x0021100D':'HFI_CMD_SESSION_CONTINUE',
+            '0x00111001':'HFI_CMD_SESSION_DECODE_FRAME',
+            '0x00111000':'HFI_CMD_SESSION_DX_START',
+            '0x00211004':'HFI_CMD_SESSION_EMPTY_BUFFER',
+            '0x00111004':'HFI_CMD_SESSION_ENCODE_EOS_COMPLETE',
+            '0x00111003':'HFI_CMD_SESSION_ENCODE_FLUSH',
+            '0x00111002':'HFI_CMD_SESSION_ENCODE_FRAME',
+            '0x00111006':'HFI_CMD_SESSION_ENCODE_INIT_RESOURCES',
+            '0x00111005':'HFI_CMD_SESSION_ENCODE_RECONFIG',
+            '0x00211005':'HFI_CMD_SESSION_FILL_BUFFER',
+            '0x00211008':'HFI_CMD_SESSION_FLUSH',
+            '0x00211009':'HFI_CMD_SESSION_GET_PROPERTY',
+            '0x00011003':'HFI_CMD_SESSION_GET_SEQUENCE_HEADER',
+            '0x00211001':'HFI_CMD_SESSION_LOAD_RESOURCES',
+            '0x00211000':'HFI_CMD_SESSION_OX_START',
+            '0x0021100A':'HFI_CMD_SESSION_PARSE_SEQUENCE_HEADER',
+            '0x0021100B':'HFI_CMD_SESSION_RELEASE_BUFFERS',
+            '0x0021100C':'HFI_CMD_SESSION_RELEASE_RESOURCES',
+            '0x00211007':'HFI_CMD_SESSION_RESUME',
+            '0x00011002':'HFI_CMD_SESSION_SET_BUFFERS',
+            '0x00011001':'HFI_CMD_SESSION_SET_PROPERTY',
+            '0x00211002':'HFI_CMD_SESSION_START',
+            '0x00211003':'HFI_CMD_SESSION_STOP',
+            '0x00211006':'HFI_CMD_SESSION_SUSPEND',
+            '0x0021100E':'HFI_CMD_SESSION_SYNC',
+            '0x00010000':'HFI_CMD_START_OFFSET',
+            '0x00010000':'HFI_CMD_SYS_COMMON_START',
+            '0x00110000':'HFI_CMD_SYS_DX_START',
+            '0x00010006':'HFI_CMD_SYS_GET_PROPERTY',
+            '0x00010001':'HFI_CMD_SYS_INIT',
+            '0x00210000':'HFI_CMD_SYS_OX_START',
+            '0x00010002':'HFI_CMD_SYS_PC_PREP',
+            '0x00210002':'HFI_CMD_SYS_PING',
+            '0x00010004':'HFI_CMD_SYS_RELEASE_RESOURCE',
+            '0x00210001':'HFI_CMD_SYS_SESSION_ABORT',
+            '0x00010008':'HFI_CMD_SYS_SESSION_END',
+            '0x00010007':'HFI_CMD_SYS_SESSION_INIT',
+            '0x00110002':'HFI_CMD_SYS_SET_ACTIVE_FENCE',
+            '0x00110004':'HFI_CMD_SYS_SET_ACTIVE_FENCE_V2',
+            '0x00010009':'HFI_CMD_SYS_SET_BUFFERS',
+            '0x00010005':'HFI_CMD_SYS_SET_PROPERTY',
+            '0x00010003':'HFI_CMD_SYS_SET_RESOURCE',
+            '0x00110001':'HFI_CMD_SYS_SYNC_PROCESS',
+            '0x00110003':'HFI_CMD_SYS_SYNC_PROCESS_V2',
+            '0x00010100':'HFI_CMD_SYS_TEST_START',
+            '0x00000001':'HFI_CMD_TYPE_OFFSET_IN_UWORD32'
+        }
+        self.hal_buf_type_dict = {
+            '0x0':'HAL_BUFFER_NONE',
+            '0x1':'HAL_BUFFER_INPUT',
+            '0x2':'HAL_BUFFER_OUTPUT',
+            '0x4':'HAL_BUFFER_OUTPUT2',
+            '0x8':'HAL_BUFFER_EXTRADATA_INPUT',
+            '0x10':'HAL_BUFFER_EXTRADATA_OUTPUT',
+            '0x20':'HAL_BUFFER_EXTRADATA_OUTPUT2',
+            '0x40':'HAL_BUFFER_INTERNAL_SCRATCH',
+            '0x80':'HAL_BUFFER_INTERNAL_SCRATCH_1',
+            '0x100':'HAL_BUFFER_INTERNAL_SCRATCH_2',
+            '0x200':'HAL_BUFFER_INTERNAL_PERSIST',
+            '0x400':'HAL_BUFFER_INTERNAL_PERSIST_1',
+            '0x800':'HAL_BUFFER_INTERNAL_CMD_QUEUE',
+            '0x1000':'HAL_BUFFER_INTERNAL_RECON'
+        }
+        self.inst_state_dict = {
+            '0x0001':'MSM_VIDC_CORE_UNINIT_DONE',
+            '0x0002':'MSM_VIDC_CORE_INIT',
+            '0x0003':'MSM_VIDC_CORE_INIT_DONE',
+            '0x0004':'MSM_VIDC_OPEN',
+            '0x0005':'MSM_VIDC_OPEN_DONE',
+            '0x0006':'MSM_VIDC_LOAD_RESOURCES',
+            '0x0007':'MSM_VIDC_LOAD_RESOURCES_DONE',
+            '0x0008':'MSM_VIDC_START',
+            '0x0009':'MSM_VIDC_START_DONE',
+            '0x000a':'MSM_VIDC_STOP',
+            '0x000b':'MSM_VIDC_STOP_DONE',
+            '0x000c':'MSM_VIDC_RELEASE_RESOURCES',
+            '0x000d':'MSM_VIDC_RELEASE_RESOURCES_DONE',
+            '0x000e':'MSM_VIDC_CLOSE',
+            '0x000f':'MSM_VIDC_CLOSE_DONE',
+            '0x0010':'MSM_VIDC_CORE_UNINIT',
+            '0x0011':'MSM_VIDC_CORE_INVALID'
+        }
+    def parse(self):
+        self.vidc_info = self.ramdump.open_file('vidc_info.txt')
+        if (self.ramdump.kernel_version < (4, 9, 0)):
+            self.vidc_info.write('Kernel version 4.9 \
+            and above are supported, current version {0}.\
+            {1}'.format(self.ramdump.kernel_version[0],
+                        self.ramdump.kernel_version[1]))
+            self.vidc_info.close()
+            return
+
+        vidc_driver_addr = self.ramdump.read_word(self.ramdump.address_of('vidc_driver'))
+
+        head_core = vidc_driver_addr + self.ramdump.field_offset('struct msm_vidc_drv', 'cores')
+        offset_core = self.ramdump.field_offset('struct msm_vidc_core', 'list')
+
+        core_walker = llist.ListWalker(self.ramdump, head_core, offset_core)
+        head_core = core_walker.next()
+        core_walker.walk(head_core,self.core_walker)
+        self.vidc_info.close()
+
+    def core_walker(self,head):
+        self.vidc_info.write('\n========CORE STATS========\n')
+
+        self.vidc_info.write('Core Addr: \t0x{:1x}\n'.format(head).expandtabs(20))
+
+        core_id = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_core', 'id')
+        self.vidc_info.write('core: \t{0}\n'.format(core_id).expandtabs(20))
+
+        state = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_core', 'state')
+        self.vidc_info.write('state: \t{0}\n'.format(state).expandtabs(20))
+
+        hfi_type = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_core', 'hfi_type')
+        self.vidc_info.write('hfi_type: \t{0}\n'.format(hfi_type).expandtabs(20))
+
+        codec_count = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_core', 'codec_count')
+        self.vidc_info.write('codec_count: \t{0}\n'.format(codec_count).expandtabs(20))
+
+        smmu_fault_handled_addr = head + self.ramdump.field_offset(
+            'struct msm_vidc_core', 'trigger_ssr')
+        smmu_fault_handled = self.ramdump.read_bool(smmu_fault_handled_addr)
+        self.vidc_info.write('smmu_fault_handled: {0}\n'.format(smmu_fault_handled))
+
+        trigger_ssr_addr = head + self.ramdump.field_offset(
+            'struct msm_vidc_core', 'trigger_ssr')
+        trigger_ssr = self.ramdump.read_bool(trigger_ssr_addr)
+        self.vidc_info.write('trigger_ssr: \t{0}\n'.format(trigger_ssr).expandtabs(20))
+
+        min_freq = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_core', 'min_freq')
+        self.vidc_info.write('min freq: \t{0}\n'.format(min_freq).expandtabs(20))
+
+        curr_freq = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_core', 'curr_freq')
+        self.vidc_info.write('curr_freq: \t{0}\n'.format(curr_freq).expandtabs(20))
+
+        self.vidc_info.write('\nCompletions:\n------------\n')
+        for i in  range(0,27):
+            completion = head + self.ramdump.field_offset('struct msm_vidc_core',\
+                                                          'completions['+str(i)+']')
+            done = self.ramdump.read_structure_field(
+                head, 'struct completion', 'done')
+
+            self.vidc_info.write('[{0:02d}]: {1}  '.format(i,'done' if done else 'pending'))
+            if (i+1)%9 == 0 or i == 26:
+                self.vidc_info.write('\n')
+
+        self.vidc_info.write('\n=======DEVICE STATS=======\n')
+
+        head_hfi_device_data = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_core', 'device')
+        head_hfi_device_data = self.ramdump.read_word(head_hfi_device_data)
+
+        self.vidc_info.write('Device Addr: \t0x{:1x}\n'.format(head_hfi_device_data).expandtabs(20))
+
+        self.get_hfi_device(head_hfi_device_data)
+
+        head_inst = head + self.ramdump.field_offset('struct msm_vidc_core', 'instances')
+        offset_inst = self.ramdump.field_offset('struct msm_vidc_inst','list')
+
+        inst_walker = llist.ListWalker(self.ramdump, head_inst, offset_inst)
+        head_inst = inst_walker.next()
+        inst_walker.walk(head_inst,self.inst_walker)
+
+    def inst_walker(self,head):
+        self.vidc_info.write('\n========INST STATS========\n')
+
+        self.vidc_info.write('Instance Addr: \t0x{:1x}\n'.format(head).expandtabs(20))
+
+        in_reconfig_addr = head + self.ramdump.field_offset(
+            'struct msm_vidc_inst', 'in_reconfig')
+        in_reconfig = self.ramdump.read_bool(in_reconfig_addr)
+        self.vidc_info.write('Reconfig: \t{0}\n'.format(in_reconfig).expandtabs(20))
+
+        reconfig_width = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'reconfig_width')
+        self.vidc_info.write('Reconfig width: \t{0}\n'.format(reconfig_width).expandtabs(20))
+
+        reconfig_height = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'reconfig_height')
+        self.vidc_info.write('Reconfig height: \t{0}\n'.format(reconfig_height).expandtabs(20))
+
+        session_type = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'session_type')
+        self.vidc_info.write('Session Type: \t{0}\n'\
+                             .format('DECODER' if session_type else 'ENCODER').expandtabs(20))
+
+        session_addr = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'session')
+        session_id = (session_addr>>32)^(session_addr&0x00000000FFFFFFFF)
+        self.vidc_info.write('Session_id: \t0x{:1x}\n'.format(session_id).expandtabs(20))
+
+        state = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'state')
+        state_str = self.inst_state_dict[format(state,'#06x')]
+        self.vidc_info.write('State: \t{0}\n'.format(state_str).expandtabs(20))
+
+        in_flush_addr = head + self.ramdump.field_offset(
+            'struct msm_vidc_inst', 'in_flush')
+        in_flush = self.ramdump.read_bool(in_flush_addr)
+        self.vidc_info.write('In flush: \t{0}\n'.format(in_flush).expandtabs(20))
+
+        pic_struct = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'pic_struct')
+        self.vidc_info.write('Pic Struct: \t{0}\n'.format(pic_struct).expandtabs(20))
+
+        colour_space = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'colour_space')
+        self.vidc_info.write('Colour Space: \t{0}\n'.format(colour_space).expandtabs(20))
+
+        profile = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'profile')
+        self.vidc_info.write('Profile: \t{0}\n'.format(profile).expandtabs(20))
+
+        level = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'level')
+        self.vidc_info.write('Level: \t{:1x}\n'.format(level).expandtabs(20))
+
+        entropy_mode = self.ramdump.read_structure_field(
+            head, 'struct msm_vidc_inst', 'entropy_mode')
+        self.vidc_info.write('Entropy Mode: \t{0}\n'.format(entropy_mode).expandtabs(20))
+
+        smem_client = self.ramdump.read_structure_field(
+            head,'struct msm_vidc_inst', 'mem_client')
+
+        client = self.ramdump.read_structure_field(
+           smem_client , 'struct smem_client', 'clnt')
+
+        display_name = self.ramdump.read_structure_cstring(
+           client , 'struct ion_client', 'display_name')
+
+        self.vidc_info.write('Client: \t{0}\n'.format(display_name).expandtabs(20))
+
+        output_fmt = head + self.ramdump.field_offset('struct msm_vidc_inst', 'fmts[0]')
+        description_addr = output_fmt
+        + self.ramdump.field_offset('struct msm_vidc_format', 'description')
+        desc_out = self.ramdump.read_cstring(description_addr)
+
+        caputre_fmt = head + self.ramdump.field_offset('struct msm_vidc_inst', 'fmts[1]')
+        description_addr = caputre_fmt
+        + self.ramdump.field_offset('struct msm_vidc_format', 'description')
+        desc_cap = self.ramdump.read_cstring(description_addr)
+
+        session_prop = head + self.ramdump.field_offset('struct msm_vidc_inst', 'prop')
+
+        fps = self.ramdump.read_structure_field(
+            session_prop, 'struct session_prop', 'fps')
+        self.vidc_info.write('FPS: \t{0}\n'.format(fps).expandtabs(20))
+
+        bitrate = self.ramdump.read_structure_field(
+            session_prop, 'struct session_prop', 'bitrate')
+        self.vidc_info.write('Bitrate: \t{0}\n'.format(bitrate).expandtabs(20))
+
+        width_out = self.ramdump.read_structure_field(
+            session_prop, 'struct session_prop', 'width[0]')
+        height_out = self.ramdump.read_structure_field(
+            session_prop, 'struct session_prop', 'height[0]')
+
+        bufq_out = head + self.ramdump.field_offset('struct msm_vidc_inst', 'bufq[0]')
+        num_planes_out = self.ramdump.read_structure_field(
+            bufq_out, 'struct buf_queue', 'num_planes')
+        plane_sizes_out = []
+        for i in  range(0,num_planes_out):
+            plane_sizes_out.append(self.ramdump.read_structure_field(
+                bufq_out, 'struct buf_queue', 'plane_sizes['+str(i)+']'))
+
+        width_cap = self.ramdump.read_structure_field(
+            session_prop, 'struct session_prop', 'width[1]')
+        height_cap = self.ramdump.read_structure_field(
+            session_prop, 'struct session_prop', 'height[1]')
+
+        bufq_cap = head + self.ramdump.field_offset('struct msm_vidc_inst', 'bufq[1]')
+        num_planes_cap = self.ramdump.read_structure_field(
+            bufq_cap, 'struct buf_queue', 'num_planes')
+        plane_sizes_cap = []
+        for i in  range(0,num_planes_cap):
+            plane_sizes_cap.append(self.ramdump.read_structure_field(
+                bufq_cap, 'struct buf_queue', 'plane_sizes['+str(i)+']'))
+
+        self.vidc_info.write('\nPORT\tWIDTH\tHEIGHT\t'.expandtabs(20)+'FMT\t'\
+                             .expandtabs(30) +'NUM_PLANES\tPLANE_SIZES\n'\
+                             .expandtabs(20) + '-'*140 + '\n')
+        self.vidc_info.write('OUTPUT\t{}\t{}\t'.format(width_out,height_out)\
+                             .expandtabs(20)+'{}\t'.format(desc_out).expandtabs(30)\
+                             +'{}\t{}\n'.format(num_planes_out,plane_sizes_out)\
+                             .expandtabs(20))
+        self.vidc_info.write('CAPUTRE\t{}\t{}\t'.format(width_cap,height_cap)\
+                             .expandtabs(20)+ '{0}\t'.format(desc_cap).expandtabs(30)\
+                             +'{}\t{}\n'.format(num_planes_cap,plane_sizes_cap)
+                             .expandtabs(20))
+        session_crop = session_prop + self.ramdump.field_offset('struct session_prop','crop_info' )
+
+        left = self.ramdump.read_structure_field(
+            session_crop, 'struct session_crop', 'left')
+        top = self.ramdump.read_structure_field(
+            session_crop, 'struct session_crop', 'top')
+        width = self.ramdump.read_structure_field(
+            session_crop, 'struct session_crop', 'width')
+        height = self.ramdump.read_structure_field(
+            session_crop, 'struct session_crop', 'height')
+
+        self.vidc_info.write('\nCROP_INFO\n=========\nLeft: \t{0}\
+                             \nTop: \t{1}\nWidth: \t{2}\nHeight: \t{3}\
+                             \n'.format(left,top,width,height).expandtabs(20))
+
+        buf_count = head + self.ramdump.field_offset('struct msm_vidc_inst', 'count')
+
+        etb = self.ramdump.read_structure_field(
+            buf_count, 'struct buf_count', 'etb')
+        ftb = self.ramdump.read_structure_field(
+            buf_count, 'struct buf_count', 'ftb')
+        ebd = self.ramdump.read_structure_field(
+            buf_count, 'struct buf_count', 'ebd')
+        fbd = self.ramdump.read_structure_field(
+            buf_count, 'struct buf_count', 'fbd')
+
+        self.vidc_info.write('\nBUFFER_COUNTS\n=============\nETB: \t{0}\
+                             \nFTB: \t{1}\nEBD: \t{2}\nFBD: \t{3}\n'\
+                             .format(etb,ftb,ebd,fbd).expandtabs(20))
+
+        self.vidc_info.write('\nBUFFER REQUIREMENTS\n===================\n')
+
+        self.vidc_info.write('TYPE\t'.expandtabs(40))
+        self.vidc_info.write('SIZE\tREGION_SIZE\tCOUNT_MIN\t'.expandtabs(20))
+        self.vidc_info.write('COUNT_MIN_HOST\tCOUNT_ACTUAL\tCONTIGUOUS\tALIGNMENT\n'.expandtabs(20))
+        self.vidc_info.write('-'*180+'\n')
+
+        buff_req = head + self.ramdump.field_offset('struct msm_vidc_inst', 'buff_req')
+
+        for i in range(0,14):#HAL_BUFFER_MAX = 14
+            buff_req_i = buff_req
+            + self.ramdump.field_offset('struct buffer_requirements', 'buffer['+str(i)+']')
+            self.buff_requirements(buff_req_i)
+            i = i+1
+
+        self.vidc_info.write('\nBUFFER INFO\n===========\n')
+
+        offset_vidc_list = self.ramdump.field_offset('struct msm_vidc_list','list')
+
+        scratchbufs = head + self.ramdump.field_offset('struct msm_vidc_inst', 'scratchbufs')
+        internal_buf_walker = llist.ListWalker(self.ramdump, scratchbufs, offset_vidc_list)
+        self.vidc_info.write('\nScratch Buffers:\n')
+        self.vidc_info.write('='*40+'\n')
+        if not(internal_buf_walker.is_empty()):
+            scratchbufs = internal_buf_walker.next()
+            self.vidc_info.write('Type\t'.expandtabs(40))
+            self.vidc_info.write('Device_Addr\tSize\tFlags\n'.expandtabs(10)+'-'*80+'\n')
+            internal_buf_walker.walk(scratchbufs,self.internal_buf_walker)
+        else:
+            self.vidc_info.write('NONE\n')
+
+        persistbufs = head + self.ramdump.field_offset('struct msm_vidc_inst', 'persistbufs')
+        internal_buf_walker = llist.ListWalker(self.ramdump, persistbufs, offset_vidc_list)
+        self.vidc_info.write('\nPersist Buffers:\n')
+        self.vidc_info.write('='*40+'\n')
+        if not(internal_buf_walker.is_empty()) :
+            persistbufs = internal_buf_walker.next()
+            self.vidc_info.write('Type\t'.expandtabs(40))
+            self.vidc_info.write('Device_Addr\tSize\tFlags\n'.expandtabs(10)+'-'*80+'\n')
+            internal_buf_walker.walk(persistbufs,self.internal_buf_walker)
+        else:
+            self.vidc_info.write('NONE\n')
+
+        pending_getpropq = head
+        + self.ramdump.field_offset('struct msm_vidc_inst', 'pending_getpropq')
+        getprop_buf_walker = llist.ListWalker(self.ramdump, pending_getpropq, offset_vidc_list)
+        self.vidc_info.write('\nPending Getpropq Buffers:\n')
+        self.vidc_info.write('='*40+'\n')
+        if not(getprop_buf_walker.is_empty()) :
+            pending_getpropq = getprop_buf_walker.next()
+            getprop_buf_walker.walk(pending_getpropq,self.getprop_buf_walker)
+        else:
+            self.vidc_info.write('NONE\n')
+
+        outputbufs = head + self.ramdump.field_offset('struct msm_vidc_inst', 'outputbufs')
+        internal_buf_walker = llist.ListWalker(self.ramdump, outputbufs, offset_vidc_list)
+        self.vidc_info.write('\nOutput Buffers:\n')
+        self.vidc_info.write('='*40+'\n')
+        if not(internal_buf_walker.is_empty()) :
+            outputbufs = internal_buf_walker.next()
+            self.vidc_info.write('Type\t'.expandtabs(40))
+            self.vidc_info.write('Device_Addr\tSize\tFlags\n'.expandtabs(10)+'-'*80+'\n')
+            internal_buf_walker.walk(outputbufs,self.internal_buf_walker)
+        else:
+            self.vidc_info.write('NONE\n')
+
+        reconbufs = head + self.ramdump.field_offset('struct msm_vidc_inst', 'reconbufs')
+        recon_buf_walker = llist.ListWalker(self.ramdump, reconbufs, offset_vidc_list)
+        self.vidc_info.write('\nReconstruction Buffers:\n')
+        self.vidc_info.write('='*40+'\n')
+        if not(recon_buf_walker.is_empty()) :
+            reconbufs = recon_buf_walker.next()
+            self.vidc_info.write('Index\tCR\tCF\n'.expandtabs(10)+'-'*30+'\n')
+            recon_buf_walker.walk(reconbufs,self.recon_buf_walker)
+        else:
+            self.vidc_info.write('NONE\n')
+
+        eosbufs = head + self.ramdump.field_offset('struct msm_vidc_inst', 'eosbufs')
+        eos_buf_walker = llist.ListWalker(self.ramdump, eosbufs, offset_vidc_list)
+        self.vidc_info.write('\nEOS Buffers:\n')
+        self.vidc_info.write('='*40+'\n')
+        if not(eos_buf_walker.is_empty()) :
+            eosbufs = eos_buf_walker.next()
+            self.vidc_info.write('Type\t'.expandtabs(40))
+            self.vidc_info.write('Device_Addr\tSize\tFlags\tRefCnt\tFd\tOffset\n'\
+                                 .expandtabs(10)+'-'*120+'\n')
+            eos_buf_walker.walk(eosbufs,self.eos_buf_walker)
+        else:
+            self.vidc_info.write('NONE\n')
+
+        registeredbufs = head + self.ramdump.field_offset('struct msm_vidc_inst', 'registeredbufs')
+        vidc_buf_walker = llist.ListWalker(self.ramdump, registeredbufs, offset_vidc_list)
+        self.vidc_info.write('\nRegistered Buffers:\n')
+        self.vidc_info.write('='*40+'\n')
+        if not(vidc_buf_walker.is_empty()) :
+            registeredbufs = vidc_buf_walker.next()
+            self.vidc_info.write('Vb2_Idx\tPlane\t'.expandtabs(10))
+            self.vidc_info.write('Type\t'.expandtabs(40))
+            self.vidc_info.write('Device_Addr\tSize\tFlags\tRefCnt\tFd\tOffset\n'
+                                 .expandtabs(10)+'-'*140+'\n')
+            vidc_buf_walker.walk(registeredbufs,self.vidc_buf_walker)
+        else:
+            self.vidc_info.write('NONE\n')
+
+    def buff_requirements (self,head):
+
+        buffer_type = self.ramdump.read_structure_field(
+            head, 'struct hal_buffer_requirements ', 'buffer_type')
+        try:
+            buffer_type_str = self.hal_buf_type_dict[hex(buffer_type)]
+        except:
+            return
+
+        if buffer_type_str == 'HAL_BUFFER_NONE':
+            return
+
+        self.vidc_info.write('{0}\t'.format(buffer_type_str).expandtabs(40))
+
+        buffer_size = self.ramdump.read_structure_field(
+            head, 'struct hal_buffer_requirements ', 'buffer_size')
+        self.vidc_info.write('{0}\t'.format(buffer_size).expandtabs(20))
+
+        buffer_region_size = self.ramdump.read_structure_field(
+            head, 'struct hal_buffer_requirements ', 'buffer_region_size')
+        self.vidc_info.write('{0}\t'.format(buffer_region_size).expandtabs(20))
+
+        buffer_count_min = self.ramdump.read_structure_field(
+            head, 'struct hal_buffer_requirements ', 'buffer_count_min')
+        self.vidc_info.write('{0}\t'.format(buffer_count_min).expandtabs(20))
+
+        buffer_count_min_host = self.ramdump.read_structure_field(
+            head, 'struct hal_buffer_requirements ', 'buffer_count_min_host')
+        self.vidc_info.write('{0}\t'.format(buffer_count_min_host).expandtabs(20))
+
+        buffer_count_actual = self.ramdump.read_structure_field(
+            head, 'struct hal_buffer_requirements ', 'buffer_count_actual')
+        self.vidc_info.write('{0}\t'.format(buffer_count_actual).expandtabs(20))
+
+        contiguous = self.ramdump.read_structure_field(
+            head, 'struct hal_buffer_requirements ', 'contiguous')
+        self.vidc_info.write('{0}\t'.format(contiguous).expandtabs(20))
+
+        buffer_alignment = self.ramdump.read_structure_field(
+            head, 'struct hal_buffer_requirements ', 'buffer_alignment')
+        self.vidc_info.write('{0}\n'.format(buffer_alignment))
+
+
+
+    def internal_buf_walker(self,head):
+
+        smem = head + self.ramdump.field_offset('struct internal_buf', 'smem')
+        internal= True
+
+        self.print_smem_buf(smem,internal)
+
+    def getprop_buf_walker(self,head):
+
+        data = self.ramdump.read_structure_field(
+            head, 'struct getprop_buf ', 'data')
+        self.vidc_info.write('data: \t{0}\n'.format(data))
+
+
+    def recon_buf_walker(self,head):
+
+        buffer_index = self.ramdump.read_structure_field(
+            head, 'struct recon_buf ', 'buffer_index')
+        self.vidc_info.write('{0}\t'.format(buffer_index).expandtabs(10))
+
+        CR = self.ramdump.read_structure_field(
+            head, 'struct recon_buf ', 'CR')
+        self.vidc_info.write('{0}\t'.format(CR).expandtabs(10))
+
+        CF = self.ramdump.read_structure_field(
+            head, 'struct recon_buf ', 'CF')
+        self.vidc_info.write('{0}\n'.format(CF))
+
+    def eos_buf_walker(self,head):
+
+        smem = head + self.ramdump.field_offset('struct eos_buf', 'smem')
+
+        self.print_smem_buf(smem)
+
+    def vidc_buf_walker(self,head):
+
+        vb2_buffer = head + self.ramdump.field_offset('struct msm_vidc_buffer', 'vvb')
+        + self.ramdump.field_offset('struct vb2_v4l2_buffer', 'vb2_buf')
+
+        index_vb2 = self.ramdump.read_structure_field(
+            vb2_buffer, 'struct vb2_buffer', 'index')
+
+        num_planes = self.ramdump.read_structure_field(
+            vb2_buffer, 'struct vb2_buffer', 'num_planes')
+
+        for i in range(0,num_planes,1):
+            self.vidc_info.write('{0}\t'.format(index_vb2).expandtabs(10))
+            self.vidc_info.write('{0}\t'.format(i).expandtabs(10))
+            smem = head + self.ramdump.field_offset('struct msm_vidc_buffer', 'smem['+str(i)+']')
+            self.print_smem_buf(smem)
+
+    def print_smem_buf (self,smem,internal = False):
+
+        buffer_type = self.ramdump.read_structure_field(
+            smem, 'struct msm_smem', 'buffer_type')
+        buffer_type_str = self.hal_buf_type_dict[hex(buffer_type)]
+        self.vidc_info.write('{0}\t'.format(buffer_type_str).expandtabs(40))
+
+        device_addr = self.ramdump.read_structure_field(
+            smem, 'struct msm_smem', 'device_addr')
+        self.vidc_info.write('0x{:01x}\t'.format(device_addr).expandtabs(10))
+
+        size = self.ramdump.read_structure_field(
+            smem, 'struct msm_smem', 'size')
+        self.vidc_info.write('{0}\t'.format(size).expandtabs(10))
+
+        flags = self.ramdump.read_structure_field(
+            smem, 'struct msm_smem', 'flags')
+        self.vidc_info.write('{0}\t'.format(flags).expandtabs(10))
+
+        if not internal:
+            refcount = self.ramdump.read_structure_field(
+                smem, 'struct msm_smem', 'refcount')
+            self.vidc_info.write('{0}\t'.format(refcount).expandtabs(10))
+
+            fd = self.ramdump.read_structure_field(
+                smem, 'struct msm_smem', 'fd')
+            self.vidc_info.write('{0}\t'.format(fd).expandtabs(10))
+
+            offset = self.ramdump.read_structure_field(
+                smem, 'struct msm_smem', 'offset')
+            self.vidc_info.write('{0}\t'.format(offset).expandtabs(10))
+
+        self.vidc_info.write('\n')
+
+    def get_hfi_device(self,head):
+
+        intr_status = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'intr_status')
+        self.vidc_info.write('intr_status: \t{0}\n'.format(intr_status).expandtabs(20))
+
+        device_id = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'device_id')
+        self.vidc_info.write('device_id: \t{0}\n'.format(device_id).expandtabs(20))
+
+        clk_freq = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'clk_freq')
+        self.vidc_info.write('clk_freq: \t{0}\n'.format(clk_freq).expandtabs(20))
+
+        last_packet_type = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'last_packet_type')
+        try:
+            last_packet_type = self.msg_dict[format(last_packet_type,'#010x')]
+        except:
+            last_packet_type = self.cmd_dict[format(last_packet_type,'#010x')]
+
+        self.vidc_info.write('last_packet_type: \t{0}\n'.format(last_packet_type).expandtabs(20))
+
+        clk_bitrate = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'clk_bitrate')
+        self.vidc_info.write('clk_bitrate: \t{0}\n'.format(clk_bitrate).expandtabs(20))
+
+        scaled_rate = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'scaled_rate')
+        self.vidc_info.write('scaled_rate: \t{0}\n'.format(scaled_rate).expandtabs(20))
+
+        power_enabled_addr = head + self.ramdump.field_offset(
+            'struct venus_hfi_device', 'power_enabled')
+        power_enabled = self.ramdump.read_bool(power_enabled_addr)
+        self.vidc_info.write('power_enabled: \t{0}\n'.format(power_enabled).expandtabs(20))
+
+        spur_count = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'spur_count')
+        self.vidc_info.write('spur_count: \t{0}\n'.format(spur_count).expandtabs(20))
+
+        reg_count = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'reg_count')
+        self.vidc_info.write('reg_count: \t{0}\n'.format(reg_count).expandtabs(20))
+
+        state = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'state')
+        self.vidc_info.write('state: \t{0}\n'.format(state).expandtabs(20))
+
+        packetization_type = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'packetization_type')
+        self.vidc_info.write('packetization_type: {0}\n'.format(packetization_type))
+
+        skip_pc_count = self.ramdump.read_structure_field(
+            head, 'struct venus_hfi_device', 'skip_pc_count')
+        self.vidc_info.write('skip_pc_count: \t{0}\n'.format(skip_pc_count).expandtabs(20))
+
+        self.queue_info = self.ramdump.open_file('cmd_queue_info.txt')
+
+        self.queue_info.write('\nCMD QUEUE\n=========\n')
+        q_cmd = head + self.ramdump.field_offset('struct venus_hfi_device','iface_queues[0]')
+        self.read_interface_queue(q_cmd)
+
+        self.queue_info.close()
+
+        self.queue_info = self.ramdump.open_file('msg_queue_info.txt')
+
+        self.queue_info.write('\nMSG QUEUE\n=========\n')
+        q_msg = head + self.ramdump.field_offset('struct venus_hfi_device','iface_queues[1]')
+        self.read_interface_queue(q_msg)
+
+        self.queue_info.close()
+
+    def read_interface_queue (self,q_addr):
+
+        q_hdr = self.ramdump.read_structure_field(
+            q_addr, 'struct vidc_iface_q_info', 'q_hdr')
+
+        qhdr_status = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_status')
+        self.queue_info.write('qhdr_status: \t{0}\n'.format(qhdr_status).expandtabs(20))
+
+        qhdr_start_addr = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_start_addr')
+        self.queue_info.write('qhdr_start_addr: \t0x{:1x}\n'.format(qhdr_start_addr).expandtabs(20))
+
+        qhdr_type = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_type')
+        qhdr_type = int(hex(qhdr_type)[-1])
+        self.queue_info.write('qhdr_type: \t{0}\n'\
+                              .format('Q_MSG' if qhdr_type else 'Q_CMD').expandtabs(20))
+
+        qhdr_q_size = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_q_size')
+        self.queue_info.write('qhdr_q_size: \t{0}\n'.format(qhdr_q_size).expandtabs(20))
+
+        qhdr_pkt_drop_cnt = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_pkt_drop_cnt')
+        self.queue_info.write('qhdr_pkt_drop_cnt: \t{0}\n'.format(qhdr_pkt_drop_cnt).expandtabs(20))
+
+        qhdr_rx_wm = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_rx_wm')
+        self.queue_info.write('qhdr_rx_wm: \t{0}\n'.format(qhdr_rx_wm).expandtabs(20))
+
+        qhdr_tx_wm = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_tx_wm')
+        self.queue_info.write('qhdr_tx_wm: \t{0}\n'.format(qhdr_tx_wm).expandtabs(20))
+
+        qhdr_rx_req = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_rx_req')
+        self.queue_info.write('qhdr_rx_req: \t{0}\n'.format(qhdr_rx_req).expandtabs(20))
+
+        qhdr_tx_req = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_tx_req')
+        self.queue_info.write('qhdr_tx_req: \t{0}\n'.format(qhdr_tx_req).expandtabs(20))
+
+        qhdr_rx_irq_status = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_rx_irq_status')
+        self.queue_info.write('qhdr_rx_irq_status: {0}\n'.format(qhdr_rx_irq_status))
+
+        qhdr_tx_irq_status = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_tx_irq_status')
+        self.queue_info.write('qhdr_tx_irq_status: {0}\n'.format(qhdr_tx_irq_status))
+
+        qhdr_read_idx = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_read_idx')
+        self.queue_info.write('qhdr_read_idx: \t{0}\n'.format(qhdr_read_idx).expandtabs(20))
+
+        qhdr_write_idx = self.ramdump.read_structure_field(
+            q_hdr, 'struct hfi_queue_header', 'qhdr_write_idx')
+        self.queue_info.write('qhdr_write_idx: \t{0}\n'.format(qhdr_write_idx).expandtabs(20))
+
+        vidc_mem_addr = q_addr + self.ramdump.field_offset('struct vidc_iface_q_info','q_array')
+        align_virtual_addr = self.ramdump.read_structure_field(
+            vidc_mem_addr, 'struct vidc_mem_addr', 'align_virtual_addr')
+        self.queue_info.write('base_addr: \t0x{:1x}\n'.format(align_virtual_addr).expandtabs(20))
+
+        self.read_packets(qhdr_read_idx,qhdr_write_idx,align_virtual_addr,qhdr_type)
+
+    def read_packets (self,read_idx,write_idx,base_addr,qhdr_type):
+
+        self.queue_info.write('\n=============PACKET STATS=============\n')
+
+        packet_num = 0
+        self.queue_info.write('\nINDEX\tREAD\tSESSION_ID\t'.expandtabs(20))
+        self.queue_info.write('TYPE\t'.expandtabs(40))
+        self.queue_info.write('SIZE\tPACKETS\n'.expandtabs(20)+'-'*200+'\n')
+        while(write_idx >0):
+
+            packet_num = packet_num + 1
+
+            self.queue_info.write('{0}\t{1}\t'\
+                                  .format(packet_num,(write_idx <= read_idx)).expandtabs(20))
+
+            write_idx = write_idx-1
+            bytes_read = 4
+            pkt_size_addr = write_idx*4 + base_addr
+            end_addr = pkt_size_addr
+
+            while((((bytes_read!=self.ramdump.read_u32(pkt_size_addr)) or (bytes_read == 4)))
+                 and (write_idx>0)):
+                bytes_read = bytes_read + 4
+                pkt_size_addr = pkt_size_addr - 4
+                write_idx = write_idx - 1
+
+                while ((bytes_read == self.ramdump.read_u32(pkt_size_addr)) and (write_idx > 0)):
+                    try:
+                        pkt_type_addr_temp = pkt_size_addr + 4
+                        pkt_type_temp = format(self.ramdump.read_u32(pkt_type_addr_temp),'#010x')
+                        if qhdr_type:
+                            pkt_type_str = self.msg_dict[pkt_type_temp]
+                        else :
+                            pkt_type_str = self.cmd_dict[pkt_type_temp]
+                        break
+                    except:
+                        bytes_read = bytes_read + 4
+                        pkt_size_addr = pkt_size_addr - 4
+                        write_idx = write_idx - 1
+
+            start_addr = pkt_size_addr
+
+            pkt_size = self.ramdump.read_u32(pkt_size_addr)
+
+            pkt_type_addr = pkt_size_addr + 4
+            pkt_type = self.ramdump.read_u32(pkt_type_addr)
+            pkt_type = format(pkt_type,'#010x')
+
+            try:
+                pkt_type_str = self.msg_dict[pkt_type] if qhdr_type else self.cmd_dict[pkt_type]
+            except:
+                pkt_type_str = "UNKNOWN_PKT_TYPE"
+
+            session_id_addr = pkt_size_addr + 8
+            session_id = self.ramdump.read_u32(session_id_addr)
+            self.queue_info.write('0x{:1x}\t'.format(session_id).expandtabs(20))
+            self.queue_info.write('{0}\t'.format(pkt_type_str).expandtabs(40))
+            self.queue_info.write('{0}\t'.format(pkt_size).expandtabs(20))
+
+            while(start_addr <= end_addr):
+                pkt = self.ramdump.read_u32(start_addr)
+                self.queue_info.write('{0:08x} '.format(pkt))
+                start_addr = start_addr + 4
+
+            self.queue_info.write('\n')