def parse(self, data, extent, desc_tag):
        # type: (bytes, int, UDFTag) -> None
        '''
        Parse the passed in data into a UDF Primary Volume Descriptor.

        Parameters:
         data - The data to parse.
         extent - The extent that this descriptor currently lives at.
         desc_tag - A UDFTag object that represents the Descriptor Tag.
        Returns:
         Nothing.
        '''
        if self._initialized:
            raise pycdlibexception.PyCdlibInternalError('UDF Primary Volume Descriptor already initialized')

        (tag_unused, self.vol_desc_seqnum, self.desc_num, self.vol_ident,
         vol_seqnum, max_vol_seqnum, interchange_level,
         self.max_interchange_level, char_set_list,
         max_char_set_list, self.vol_set_ident, self.desc_char_set,
         self.explanatory_char_set, self.vol_abstract_length, self.vol_abstract_extent,
         self.vol_copyright_length, self.vol_copyright_extent, app_ident,
         recording_date, impl_ident, self.implementation_use,
         self.predecessor_vol_desc_location, flags,
         reserved) = struct.unpack_from(self.FMT, data, 0)

        self.desc_tag = desc_tag

        if vol_seqnum != 1:
            raise pycdlibexception.PyCdlibInvalidISO('Only DVD Read-Only disks are supported')
        if max_vol_seqnum != 1:
            raise pycdlibexception.PyCdlibInvalidISO('Only DVD Read-Only disks are supported')
        if interchange_level != 2:
            raise pycdlibexception.PyCdlibInvalidISO('Only DVD Read-Only disks are supported')
        if char_set_list != 1:
            raise pycdlibexception.PyCdlibInvalidISO('Only DVD Read-Only disks are supported')
        if max_char_set_list != 1:
            raise pycdlibexception.PyCdlibInvalidISO('Only DVD Read-Only disks are supported')
        if flags != 0:
            raise pycdlibexception.PyCdlibInvalidISO('Only DVD Read-Only disks are supported')

        if reserved != b'\x00' * 22:
            raise pycdlibexception.PyCdlibInvalidISO('UDF Primary Volume Descriptor reserved data not 0')

        self.recording_date = UDFTimestamp()
        self.recording_date.parse(recording_date)

        self.app_ident = UDFEntityID()
        self.app_ident.parse(app_ident)

        self.impl_ident = UDFEntityID()
        self.impl_ident.parse(impl_ident)

        self.orig_extent_loc = extent

        self._initialized = True
Parse the passed in data into a UDF Primary Volume Descriptor.

        Parameters:
         data - The data to parse.
         extent - The extent that this descriptor currently lives at.
         desc_tag - A UDFTag object that represents the Descriptor Tag.
        Returns:
         Nothing.