code: def _canon_decode_camera_info(self, camera_info_tag):
          
          model = self.tags.get('Image Model', None)
          if not model:
              return
          model = str(model.values)
  
          camera_info_tags = None
          for (model_name_re, tag_desc) in makernote.canon.CAMERA_INFO_MODEL_MAP.items():
              if re.search(model_name_re, model):
                  camera_info_tags = tag_desc
                  break
          else:
              return
  
          # We are assuming here that these are all unsigned bytes (Byte or
          # Unknown)
          if camera_info_tag.field_type not in (1, 7):
              return
          camera_info = struct.pack('<%dB' % len(camera_info_tag.values),
                                    *camera_info_tag.values)
  
          # Look for each data value and decode it appropriately.
          for offset, tag in camera_info_tags.items():
              tag_format = tag[1]
              tag_size = struct.calcsize(tag_format)
              if len(camera_info) < offset + tag_size:
                  continue
              packed_tag_value = camera_info[offset:offset + tag_size]
              tag_value = struct.unpack(tag_format, packed_tag_value)[0]
  
              tag_name = tag[0]
              if len(tag) > 2:
                  if callable(tag[2]):
                      tag_value = tag[2](tag_value)
                  else:
                      tag_value = tag[2].get(tag_value, tag_value)
              logger.debug(" %s %s", tag_name, tag_value)
  
              self.tags['MakerNote ' + tag_name] = IfdTag(str(tag_value), None,
                                                          0, None, None, None)
docs: Decode the variable length encoded camera info section.