Coverage Report - org.jaudiotagger.tag.id3.ID3Frames
 
Classes in this File Line Coverage Branch Coverage Complexity
ID3Frames
98%
120/122
100%
2/2
0
 
 1  
 /*
 2  
  *  MusicTag Copyright (C)2003,2004
 3  
  *
 4  
  *  This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
 5  
  *  General Public  License as published by the Free Software Foundation; either version 2.1 of the License,
 6  
  *  or (at your option) any later version.
 7  
  *
 8  
  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 9  
  *  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 10  
  *  See the GNU Lesser General Public License for more details.
 11  
  *
 12  
  *  You should have received a copy of the GNU Lesser General Public License along with this library; if not,
 13  
  *  you can get a copy from http://www.opensource.org/licenses/lgpl-license.php or write to the Free Software
 14  
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 15  
  */
 16  
 package org.jaudiotagger.tag.id3;
 17  
 
 18  
 import org.jaudiotagger.tag.datatype.AbstractStringStringValuePair;
 19  
 
 20  
 import java.util.Iterator;
 21  
 import java.util.LinkedHashMap;
 22  
 import java.util.Map;
 23  
 import java.util.TreeSet;
 24  
 
 25  
 /**
 26  
  * Subclasses Defines ID3 frames for their Tag Version
 27  
  * <p/>
 28  
  * Here we specify how frames are mapped between different Tag Versions
 29  
  *
 30  
  * @author Paul Taylor
 31  
  * @version $Id: ID3Frames.java,v 1.15 2008/07/21 10:45:47 paultaylor Exp $
 32  
  */
 33  125
 public abstract class ID3Frames extends AbstractStringStringValuePair
 34  
 {
 35  
     /**
 36  
      * Holds frames whereby multiple occurences are allowed
 37  
      */
 38  125
     protected TreeSet<String> multipleFrames = new TreeSet<String>();
 39  
 
 40  
     /**
 41  
      * These frames should be lost if file changes
 42  
      */
 43  125
     protected TreeSet<String> discardIfFileAlteredFrames = new TreeSet<String>();
 44  
 
 45  
     /**
 46  
      * These frames are part of the Official Specification for that Tag Version
 47  
      */
 48  125
     protected TreeSet<String> supportedFrames = new TreeSet<String>();
 49  
 
 50  
     /**
 51  
      * These frames are extensions to the  Specification for that Tag Version
 52  
      */
 53  125
     protected TreeSet<String> extensionFrames = new TreeSet<String>();
 54  
 
 55  
     /**
 56  
      * These frames are Common , this is a loose term
 57  
      */
 58  125
     protected TreeSet<String> commonFrames = new TreeSet<String>();
 59  
 
 60  
     /**
 61  
      * These frames are Binary
 62  
      */
 63  125
     protected TreeSet<String> binaryFrames = new TreeSet<String>();
 64  
 
 65  
     /**
 66  
      * If file changes discard these frames
 67  
      */
 68  
     public boolean isDiscardIfFileAltered(String frameID)
 69  
     {
 70  2122
         return discardIfFileAlteredFrames.contains(frameID);
 71  
     }
 72  
 
 73  
     /**
 74  
      * Are multiple ocurrences of frame allowed
 75  
      */
 76  
     public boolean isMultipleAllowed(String frameID)
 77  
     {
 78  3690
         return multipleFrames.contains(frameID);
 79  
     }
 80  
 
 81  
     /**
 82  
      * @param frameID
 83  
      * @return true if frames with this id are part of the specification
 84  
      */
 85  
     public boolean isSupportedFrames(String frameID)
 86  
     {
 87  39
         return supportedFrames.contains(frameID);
 88  
     }
 89  
 
 90  
     /**
 91  
      * @param frameID
 92  
      * @return true if frames with this id are considered common
 93  
      */
 94  
     public boolean isCommon(String frameID)
 95  
     {
 96  0
         return commonFrames.contains(frameID);
 97  
     }
 98  
 
 99  
     /**
 100  
      * @param frameID
 101  
      * @return true if frames with this id are binary (non textual data)
 102  
      */
 103  
     public boolean isBinary(String frameID)
 104  
     {
 105  0
         return binaryFrames.contains(frameID);
 106  
     }
 107  
 
 108  
 
 109  
     /**
 110  
      * @param frameID
 111  
      * @return true if frame is a known extension
 112  
      */
 113  
     public boolean isExtensionFrames(String frameID)
 114  
     {
 115  39
         return extensionFrames.contains(frameID);
 116  
     }
 117  
 
 118  
 
 119  
     /**
 120  
      * Mapping from v22 to v23
 121  
      */
 122  43
     public static final Map<String, String> convertv22Tov23 = new LinkedHashMap<String, String>();
 123  43
     public static final Map<String, String> convertv23Tov22 = new LinkedHashMap<String, String>();
 124  43
     public static final Map<String, String> forcev22Tov23 = new LinkedHashMap<String, String>();
 125  43
     public static final Map<String, String> forcev23Tov22 = new LinkedHashMap<String, String>();
 126  
 
 127  43
     public static final Map<String, String> convertv23Tov24 = new LinkedHashMap<String, String>();
 128  43
     public static final Map<String, String> convertv24Tov23 = new LinkedHashMap<String, String>();
 129  43
     public static final Map<String, String> forcev23Tov24 = new LinkedHashMap<String, String>();
 130  43
     public static final Map<String, String> forcev24Tov23 = new LinkedHashMap<String, String>();
 131  
 
 132  
 
 133  
     private static void loadID3v23ID3v24Mapping()
 134  
     {
 135  
         // Define the mapping from v23 to v24 only maps values where
 136  
         // the v23 ID is not a v24 ID and where the translation from v23 to v24
 137  
         // ID does not affect the framebody.
 138  
         //This one way allows us to convert XSOT to TSOT,XSOP to TSOP and XSOA - TSOA but in the other direction gets converted to TSOT,TSOP,TSOA
 139  43
         convertv23Tov24.put(ID3v23Frames.FRAME_ID_V3_TITLE_SORT_ORDER_MUSICBRAINZ, ID3v24Frames.FRAME_ID_TITLE_SORT_ORDER);
 140  43
         convertv23Tov24.put(ID3v23Frames.FRAME_ID_V3_ARTIST_SORT_ORDER_MUSICBRAINZ, ID3v24Frames.FRAME_ID_ARTIST_SORT_ORDER);
 141  43
         convertv23Tov24.put(ID3v23Frames.FRAME_ID_V3_ALBUM_SORT_ORDER_MUSICBRAINZ, ID3v24Frames.FRAME_ID_ALBUM_SORT_ORDER);
 142  
 
 143  
         // No others exist because most v23 mappings are identical to v24 therefore no mapping required and the ones that
 144  
         // are different need to be forced.
 145  
 
 146  
         // Force v23 to v24 These are deprecated and need to do a forced mapping
 147  43
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_RELATIVE_VOLUME_ADJUSTMENT, ID3v24Frames.FRAME_ID_RELATIVE_VOLUME_ADJUSTMENT2);
 148  43
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_EQUALISATION, ID3v24Frames.FRAME_ID_EQUALISATION2);
 149  43
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_IPLS, ID3v24Frames.FRAME_ID_INVOLVED_PEOPLE);
 150  43
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TDAT, ID3v24Frames.FRAME_ID_YEAR);
 151  43
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TIME, ID3v24Frames.FRAME_ID_YEAR);
 152  43
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TORY, ID3v24Frames.FRAME_ID_ORIGINAL_RELEASE_TIME);
 153  43
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TRDA, ID3v24Frames.FRAME_ID_YEAR);
 154  43
         forcev23Tov24.put(ID3v23Frames.FRAME_ID_V3_TYER, ID3v24Frames.FRAME_ID_YEAR);
 155  
 
 156  
         // Note Force v24 to v23, TDRC is a 1M relationship handled specially.
 157  
         // @TODO EQUALISATION
 158  43
         forcev24Tov23.put(ID3v24Frames.FRAME_ID_RELATIVE_VOLUME_ADJUSTMENT2, ID3v23Frames.FRAME_ID_V3_RELATIVE_VOLUME_ADJUSTMENT);
 159  
 
 160  
         // Used to be a special frame now a text frame
 161  43
         forcev24Tov23.put(ID3v24Frames.FRAME_ID_INVOLVED_PEOPLE, ID3v23Frames.FRAME_ID_V3_IPLS);
 162  
 
 163  43
     }
 164  
 
 165  
     private static void loadID3v22ID3v23Mapping()
 166  
     {
 167  
         Iterator<String> iterator;
 168  
         String key;
 169  
         String value;
 170  
 
 171  
         // All v22 ids were renamed in v23, but are essentially the same
 172  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ACCOMPANIMENT, ID3v23Frames.FRAME_ID_V3_ACCOMPANIMENT);
 173  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ALBUM, ID3v23Frames.FRAME_ID_V3_ALBUM);
 174  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ARTIST, ID3v23Frames.FRAME_ID_V3_ARTIST);
 175  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_AUDIO_ENCRYPTION, ID3v23Frames.FRAME_ID_V3_AUDIO_ENCRYPTION);
 176  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_BPM, ID3v23Frames.FRAME_ID_V3_BPM);
 177  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COMMENT, ID3v23Frames.FRAME_ID_V3_COMMENT);
 178  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COMMENT, ID3v23Frames.FRAME_ID_V3_COMMENT);
 179  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COMPOSER, ID3v23Frames.FRAME_ID_V3_COMPOSER);
 180  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_CONDUCTOR, ID3v23Frames.FRAME_ID_V3_CONDUCTOR);
 181  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_CONTENT_GROUP_DESC, ID3v23Frames.FRAME_ID_V3_CONTENT_GROUP_DESC);
 182  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COPYRIGHTINFO, ID3v23Frames.FRAME_ID_V3_COPYRIGHTINFO);
 183  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ENCODEDBY, ID3v23Frames.FRAME_ID_V3_ENCODEDBY);
 184  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_EQUALISATION, ID3v23Frames.FRAME_ID_V3_EQUALISATION);
 185  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_EVENT_TIMING_CODES, ID3v23Frames.FRAME_ID_V3_EVENT_TIMING_CODES);
 186  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_FILE_TYPE, ID3v23Frames.FRAME_ID_V3_FILE_TYPE);
 187  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_GENERAL_ENCAPS_OBJECT, ID3v23Frames.FRAME_ID_V3_GENERAL_ENCAPS_OBJECT);
 188  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_GENRE, ID3v23Frames.FRAME_ID_V3_GENRE);
 189  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_HW_SW_SETTINGS, ID3v23Frames.FRAME_ID_V3_HW_SW_SETTINGS);
 190  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_INITIAL_KEY, ID3v23Frames.FRAME_ID_V3_INITIAL_KEY);
 191  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_IPLS, ID3v23Frames.FRAME_ID_V3_IPLS);
 192  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ISRC, ID3v23Frames.FRAME_ID_V3_ISRC);
 193  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_LANGUAGE, ID3v23Frames.FRAME_ID_V3_LANGUAGE);
 194  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_LENGTH, ID3v23Frames.FRAME_ID_V3_LENGTH);
 195  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_LINKED_INFO, ID3v23Frames.FRAME_ID_V3_LINKED_INFO);
 196  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_LYRICIST, ID3v23Frames.FRAME_ID_V3_LYRICIST);
 197  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_MEDIA_TYPE, ID3v23Frames.FRAME_ID_V3_MEDIA_TYPE);
 198  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_MPEG_LOCATION_LOOKUP_TABLE, ID3v23Frames.FRAME_ID_V3_MPEG_LOCATION_LOOKUP_TABLE);
 199  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_MUSIC_CD_ID, ID3v23Frames.FRAME_ID_V3_MUSIC_CD_ID);
 200  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ORIGARTIST, ID3v23Frames.FRAME_ID_V3_ORIGARTIST);
 201  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ORIG_FILENAME, ID3v23Frames.FRAME_ID_V3_ORIG_FILENAME);
 202  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ORIG_LYRICIST, ID3v23Frames.FRAME_ID_V3_ORIG_LYRICIST);
 203  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ORIG_TITLE, ID3v23Frames.FRAME_ID_V3_ORIG_TITLE);
 204  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_PLAYLIST_DELAY, ID3v23Frames.FRAME_ID_V3_PLAYLIST_DELAY);
 205  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_PLAY_COUNTER, ID3v23Frames.FRAME_ID_V3_PLAY_COUNTER);
 206  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_PLAY_COUNTER, ID3v23Frames.FRAME_ID_V3_PLAY_COUNTER);
 207  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_POPULARIMETER, ID3v23Frames.FRAME_ID_V3_POPULARIMETER);
 208  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_PUBLISHER, ID3v23Frames.FRAME_ID_V3_PUBLISHER);
 209  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_RECOMMENDED_BUFFER_SIZE, ID3v23Frames.FRAME_ID_V3_RECOMMENDED_BUFFER_SIZE);
 210  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_RECOMMENDED_BUFFER_SIZE, ID3v23Frames.FRAME_ID_V3_RECOMMENDED_BUFFER_SIZE);
 211  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_RELATIVE_VOLUME_ADJUSTMENT, ID3v23Frames.FRAME_ID_V3_RELATIVE_VOLUME_ADJUSTMENT);
 212  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_REMIXED, ID3v23Frames.FRAME_ID_V3_REMIXED);
 213  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_REVERB, ID3v23Frames.FRAME_ID_V3_REVERB);
 214  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_SET, ID3v23Frames.FRAME_ID_V3_SET);
 215  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_SYNC_LYRIC, ID3v23Frames.FRAME_ID_V3_SYNC_LYRIC);
 216  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_SYNC_TEMPO, ID3v23Frames.FRAME_ID_V3_SYNC_TEMPO);
 217  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TDAT, ID3v23Frames.FRAME_ID_V3_TDAT);
 218  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TIME, ID3v23Frames.FRAME_ID_V3_TIME);
 219  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TITLE_REFINEMENT, ID3v23Frames.FRAME_ID_V3_TITLE_REFINEMENT);
 220  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TORY, ID3v23Frames.FRAME_ID_V3_TORY);
 221  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TRACK, ID3v23Frames.FRAME_ID_V3_TRACK);
 222  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TRDA, ID3v23Frames.FRAME_ID_V3_TRDA);
 223  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TSIZ, ID3v23Frames.FRAME_ID_V3_TSIZ);
 224  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TYER, ID3v23Frames.FRAME_ID_V3_TYER);
 225  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_UNIQUE_FILE_ID, ID3v23Frames.FRAME_ID_V3_UNIQUE_FILE_ID);
 226  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_UNIQUE_FILE_ID, ID3v23Frames.FRAME_ID_V3_UNIQUE_FILE_ID);
 227  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_UNSYNC_LYRICS, ID3v23Frames.FRAME_ID_V3_UNSYNC_LYRICS);
 228  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_ARTIST_WEB, ID3v23Frames.FRAME_ID_V3_URL_ARTIST_WEB);
 229  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_COMMERCIAL, ID3v23Frames.FRAME_ID_V3_URL_COMMERCIAL);
 230  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_COPYRIGHT, ID3v23Frames.FRAME_ID_V3_URL_COPYRIGHT);
 231  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_FILE_WEB, ID3v23Frames.FRAME_ID_V3_URL_FILE_WEB);
 232  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_OFFICIAL_RADIO, ID3v23Frames.FRAME_ID_V3_URL_OFFICIAL_RADIO);
 233  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_PAYMENT, ID3v23Frames.FRAME_ID_V3_URL_PAYMENT);
 234  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_PUBLISHERS, ID3v23Frames.FRAME_ID_V3_URL_PUBLISHERS);
 235  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_URL_SOURCE_WEB, ID3v23Frames.FRAME_ID_V3_URL_SOURCE_WEB);
 236  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_USER_DEFINED_INFO, ID3v23Frames.FRAME_ID_V3_USER_DEFINED_INFO);
 237  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_USER_DEFINED_URL, ID3v23Frames.FRAME_ID_V3_USER_DEFINED_URL);
 238  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TITLE, ID3v23Frames.FRAME_ID_V3_TITLE);
 239  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_IS_COMPILATION, ID3v23Frames.FRAME_ID_V3_IS_COMPILATION);
 240  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_TITLE_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_TITLE_SORT_ORDER_ITUNES);
 241  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ARTIST_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_ARTIST_SORT_ORDER_ITUNES);
 242  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ALBUM_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_ALBUM_SORT_ORDER_ITUNES);
 243  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_ALBUM_ARTIST_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_ALBUM_ARTIST_SORT_ORDER_ITUNES);
 244  43
         convertv22Tov23.put(ID3v22Frames.FRAME_ID_V2_COMPOSER_SORT_ORDER_ITUNES, ID3v23Frames.FRAME_ID_V3_COMPOSER_SORT_ORDER_ITUNES);
 245  
 
 246  
         // v23 to v22 The translation is both way
 247  43
         iterator = convertv22Tov23.keySet().iterator();
 248  3010
         while (iterator.hasNext())
 249  
         {
 250  2967
             key = iterator.next();
 251  2967
             value = convertv22Tov23.get(key);
 252  2967
             convertv23Tov22.put(value, key);
 253  
         }
 254  
 
 255  
         //This one way translation allows us to convert XSOT to TST, but in the other direction gets converted to TSOT
 256  43
         convertv23Tov22.put(ID3v23Frames.FRAME_ID_V3_TITLE_SORT_ORDER_MUSICBRAINZ, ID3v22Frames.FRAME_ID_V2_TITLE_SORT_ORDER_ITUNES);
 257  43
         convertv23Tov22.put(ID3v23Frames.FRAME_ID_V3_ARTIST_SORT_ORDER_MUSICBRAINZ, ID3v22Frames.FRAME_ID_V2_ARTIST_SORT_ORDER_ITUNES);
 258  43
         convertv23Tov22.put(ID3v23Frames.FRAME_ID_V3_ALBUM_SORT_ORDER_MUSICBRAINZ, ID3v22Frames.FRAME_ID_V2_ALBUM_SORT_ORDER_ITUNES);
 259  
 
 260  
         //TODO What does CRM Map to ?
 261  
         // Force v22 to v23,  Extra fields in v23 version
 262  43
         forcev22Tov23.put(ID3v22Frames.FRAME_ID_V2_ATTACHED_PICTURE, ID3v23Frames.FRAME_ID_V3_ATTACHED_PICTURE);
 263  
 
 264  
         // Force v23 to v22
 265  43
         forcev23Tov22.put(ID3v23Frames.FRAME_ID_V3_ATTACHED_PICTURE, ID3v22Frames.FRAME_ID_V2_ATTACHED_PICTURE);
 266  43
     }
 267  
 
 268  
     static
 269  
     {
 270  43
         loadID3v22ID3v23Mapping();
 271  43
         loadID3v23ID3v24Mapping();
 272  43
     }
 273  
 
 274  
 
 275  
 }