@Override
  protected ChannelBuffer read(int fd, long position, int length)
      throws IOException, XrootdException {
    if (fd < 0 || fd >= descriptors.size() || descriptors.get(fd) == null) {
      throw new XrootdException(kXR_FileNotOpen, "Invalid file descriptor");
    }

    FileDescriptor descriptor = descriptors.get(fd);
    byte[] chunkArray = new byte[length];
    ByteBuffer chunk = ByteBuffer.wrap(chunkArray);
    descriptor.read(chunk, position);
    return wrappedBuffer(chunkArray, 0, chunkArray.length - chunk.remaining());
  }
  protected void read(Map<Integer, ByteBuffer> tags) {
    super.read(tags);

    for (Iterator<Entry<Integer, ByteBuffer>> it = tags.entrySet().iterator(); it.hasNext(); ) {
      Entry<Integer, ByteBuffer> entry = it.next();

      ByteBuffer _bb = entry.getValue();

      switch (entry.getKey()) {
        case 0x3215:
          signalStandard = _bb.get();
          break;
        case 0x320c:
          frameLayout = LayoutType.values()[_bb.get()];
          break;
        case 0x3203:
          storedWidth = _bb.getInt();
          break;
        case 0x3202:
          storedHeight = _bb.getInt();
          break;
        case 0x3216:
          storedF2Offset = _bb.getInt();
          break;
        case 0x3205:
          sampledWidth = _bb.getInt();
          break;
        case 0x3204:
          sampledHeight = _bb.getInt();
          break;
        case 0x3206:
          sampledXOffset = _bb.getInt();
          break;
        case 0x3207:
          sampledYOffset = _bb.getInt();
          break;
        case 0x3208:
          displayHeight = _bb.getInt();
          break;
        case 0x3209:
          displayWidth = _bb.getInt();
          break;
        case 0x320a:
          displayXOffset = _bb.getInt();
          break;
        case 0x320b:
          displayYOffset = _bb.getInt();
          break;
        case 0x3217:
          displayF2Offset = _bb.getInt();
          break;
        case 0x320e:
          aspectRatio = new Rational(_bb.getInt(), _bb.getInt());
          break;
        case 0x3218:
          activeFormatDescriptor = _bb.get();
          break;
        case 0x320d:
          videoLineMap = readInt32Batch(_bb);
          break;
        case 0x320f:
          alphaTransparency = _bb.get();
          break;
        case 0x3210:
          transferCharacteristic = UL.read(_bb);
          break;
        case 0x3211:
          imageAlignmentOffset = _bb.getInt();
          break;
        case 0x3213:
          imageStartOffset = _bb.getInt();
          break;
        case 0x3214:
          imageEndOffset = _bb.getInt();
          break;
        case 0x3212:
          fieldDominance = _bb.get();
          break;
        case 0x3201:
          pictureEssenceCoding = UL.read(_bb);
          break;
        case 0x321a:
          codingEquations = UL.read(_bb);
          break;
        case 0x3219:
          colorPrimaries = UL.read(_bb);
          break;
        default:
          Logger.warn(String.format("Unknown tag [ " + ul + "]: %04x", entry.getKey()));
          continue;
      }
      it.remove();
    }
  }