@Override
  public void startElement(String uri, String localName, String qName, Attributes attributes)
      throws SAXException {
    super.startElement(uri, localName, qName, attributes);
    // Logger.d(TAG, "_   start Element " + uri + ", " + localName + ", " + qName);

    isValid = true;
    isThumbnail = false;
    passCharacters = false;
    String name = localName;

    switch (mapToField(name)) {
      case CONTAINER:
        mContent = new Item();
        mContent.setId(attributes.getValue(ATTRIBUTE_ID));
        mContent.setParentid(attributes.getValue(ATTRIBUTE_PARENT_ID));
        mContent.setChildCount(attributes.getValue(ATTRIBUTE_CHILD_COUNT));
        break;

      case ITEM:
        mContent = new Item();
        mContent.setId(attributes.getValue(ATTRIBUTE_ID));
        mContent.setParentid(attributes.getValue(ATTRIBUTE_PARENT_ID));
        mMaxPixels = 0x7FFFFFFF;

        ImageItemProcessing = false;
        resolution_set = null;
        resolution_set = resolution_set_init;
        break;

      case RES:
        {
          ImageItemProcessing = true;
          String protocolInfo = attributes.getValue(ATTRIBUTE_PROTOCOL_INFO);
          String resolution = null;

          if (null != protocolInfo) {
            String protocolInfoToken[] = protocolInfo.split(":");
            short iva = detectMediaType(protocolInfoToken[2]);

            switch (iva) {
              case IMAGE:
                res_index = UNDEFINE;

                if (true == protocolInfoToken[2].endsWith("x-ycbcr-yuv420")) {
                  isValid = false;
                  passCharacters = true;
                } else {
                  res_index = findTAGIndex(protocolInfoToken[3]);

                  resolution = attributes.getValue(ATTRIBUTE_RESOLUTION);
                  if ((UNDEFINE != res_index) && null != resolution) {
                    resolution_set[res_index][RES_VALUES] = resolution;
                    int difference = 0;
                    int pixels = 0;
                    String[] hw = resolution.split("x");

                    pixels = Integer.parseInt(hw[0]) * Integer.parseInt(hw[1]);
                    difference = Math.abs(REFERENCED_HD_RESOLUTION - pixels);

                    if (mMaxPixels > difference) {
                      mMaxPixels = difference;
                    } else {
                      isValid = false;
                      passCharacters = true;
                    }

                    hw = null;
                  } else if (null != mContent.getUrl()) {
                    isValid = false;
                    passCharacters = true;
                  }
                }
                break;

              case VIDEO:
                if (null == mContent.getUrl()) {
                  /*if ( true == protocolInfoToken[0].equals( "rtsp-rtp-udp" )) {
                      isValid = false;
                      passCharacters = true;
                  }
                  else if ( true == protocolInfoToken[3].contains( "DLNA.ORG_CI=1" )) {
                      isValid = false;
                      passCharacters= true;
                  }
                  else if ( true == protocolInfoToken[2].endsWith( "x-ms-wmv" )) {
                      if ( false == protocolInfoToken[3].contains( "DLNA.ORG_PN=WMVSPML_BASE" ) &&
                           false == protocolInfoToken[3].contains( "DLNA.ORG_PN=WMVSPLL_BASE" )) {
                          isValid = false;
                          passCharacters = true;
                      }
                  }*/
                  if (false == protocolInfoToken[0].equals("rtsp-rtp-udp")
                      && false == protocolInfoToken[3].contains("DLNA.ORG_CI=1")) {
                    resolution = attributes.getValue(ATTRIBUTE_RESOLUTION);
                  } else {
                    isValid = false;
                    passCharacters = true;
                  }
                }
                break;

              case AUDIO:
                if (true == protocolInfoToken[3].contains("DLNA.ORG_CI=1")) {
                  isValid = false;
                  passCharacters = true;
                }
                break;

              default:
                isValid = false;
                passCharacters = true;
                break;
            }

            // if ( true == isValid && false == isThumbnail ) {
            if (true == isValid) {

              String size = attributes.getValue(ATTRIBUTE_SIZE);

              if (IMAGE == iva || VIDEO == iva) {
                if (null == resolution) {
                  resolution = "";
                }
                mContent.setResolution(resolution);
                resolution = null;
              }

              if (AUDIO == iva || VIDEO == iva) {
                mContent.setDuration(
                    UpnpTool.getTimeSecond(attributes.getValue(ATTRIBUTE_DURATION)));
              }

              if (null == size) {
                size = "0";
              }

              mContent.setFileSize(size);
              mContent.setFormat(protocolInfoToken[2]);
              mContent.setProtocolInfo(protocolInfo);
              mContent.setProtocolName(protocolInfoToken[0]);

              size = null;
            }

            protocolInfo = null;
            protocolInfoToken = null;
          }
        }
        break;

      case UPNP_ALBUM_ART_URI:
        profileId = attributes.getValue(ATTRIBUTE_PROFILE_ID);

        if (false == profileId.equals("JPEG_TN")) {
          isValid = false;
          passCharacters = true;
        }

        break;

      case UPNP_ARTIST:
        role = attributes.getValue(ATTRIBUTE_ROLE);
        if (role != null) {
          if (false == role.equals("AlbumArtist")) {
            isValid = false;
            passCharacters = true;
          }
        } else {
          isValid = false;
          passCharacters = true;
        }
        break;

      case DC_CREATOR:
      case DC_DATE:
      case DC_TITLE:
      case UPNP_ACTOR:
      case UPNP_ALBUM:
      case UPNP_CLASS:
      case UPNP_GENRE:
      case UPNP_ORIGINAL_TRACK_NUMBER:
        break;

      default:
        isValid = false;
        passCharacters = true;
        Logger.d(TAG, "   skip Element");
        break;
    }
  }
  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException {
    super.endElement(uri, localName, qName);
    String name = localName;

    // Logger.d(TAG, "    end Element " + uri + "," + localName + "," + qName);

    switch (mapToField(name)) {
      case CONTAINER:
        mContentList.add(mContent);
        break;

      case DC_CREATOR:
        mContent.setCreator(currentText.toString());
        break;

      case DC_DATE:
        mContent.setDate(currentText.toString());
        break;

      case DC_TITLE:
        mContent.setTitle(currentText.toString());
        break;

      case ITEM:
        if (ImageItemProcessing) {
          // Desc search from TN to LRG
          for (int i = 0; i < resolution_set.length; i++) {
            String URL = resolution_set[i][IMG_URL];
            if (null != URL) {
              // Logger.d(TAG, " set thumbnail:" +
              // resolution_set[i][RES_TAG]);
              mContent.setThumbnailUrl(URL);
              break;
            }
          }

          // ASC search from LRG to TN
          for (int i = resolution_set.length - 1; i >= 0; i--) {
            String URL = resolution_set[i][IMG_URL];
            if (null != URL) {
              // Logger.d(TAG, " set url:" +
              // resolution_set[i][RES_TAG]);
              mContent.setUrl(URL);
              mContent.setResolution(resolution_set[i][RES_VALUES]);
              break;
            }
          }
        }
        ImageItemProcessing = false;
        mContentList.add(mContent);
        break;

      case RES:
        if (res_index != UNDEFINE) {
          resolution_set[res_index][IMG_URL] = currentText.toString();
          // Logger.d(TAG, " res_index " + res_index);
        }
        break;

      case UPNP_ACTOR:
        mContent.setActor(currentText.toString());
        break;

      case UPNP_ALBUM:
        mContent.setAlbum(currentText.toString());
        break;

      case UPNP_ALBUM_ART_URI:
        mContent.setAlbumUrl(currentText.toString());
        profileId = null;
        break;

      case UPNP_ARTIST:
        if (true == isValid && null != role) {
          if (true == role.equals("AlbumArtist")) {
            mContent.setArtist(currentText.toString());
          }
          role = null;
        }

        break;

      case UPNP_CLASS:
        mContent.setUpnpClass(currentText.toString());
        break;

      case UPNP_GENRE:
        mContent.setGenre(currentText.toString());
        break;

      default:
        Logger.d(TAG, "   SKIP !!");
        // Do Nothing;
        break;
    }

    currentText.setLength(0);
  }