Ignore:
Timestamp:
2013-08-09T18:05:11+02:00 (11 years ago)
Author:
bastiK
Message:

applied #8895 - Upgrade metadata-extractor to v. 2.6.4 (patch by ebourg)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/com/drew/metadata/exif/PanasonicMakernoteDescriptor.java

    r4231 r6127  
    11/*
    2  * This is public domain software - that is, you can do whatever you want
    3  * with it, and include it software that is licensed under the GNU or the
    4  * BSD license, or whatever other licence you choose, including proprietary
    5  * closed source licenses.  I do ask that you leave this header in tact.
     2 * Copyright 2002-2012 Drew Noakes
    63 *
    7  * If you make modifications to this code that you think would benefit the
    8  * wider community, please send me a copy and I'll post it on my site.
     4 *    Licensed under the Apache License, Version 2.0 (the "License");
     5 *    you may not use this file except in compliance with the License.
     6 *    You may obtain a copy of the License at
    97 *
    10  * If you make use of this code, I'd appreciate hearing about it.
    11  *   drew@drewnoakes.com
    12  * Latest version of this software kept at
    13  *   http://drewnoakes.com/
     8 *        http://www.apache.org/licenses/LICENSE-2.0
     9 *
     10 *    Unless required by applicable law or agreed to in writing, software
     11 *    distributed under the License is distributed on an "AS IS" BASIS,
     12 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 *    See the License for the specific language governing permissions and
     14 *    limitations under the License.
     15 *
     16 * More information about this project is available at:
     17 *
     18 *    http://drewnoakes.com/code/exif/
     19 *    http://code.google.com/p/metadata-extractor/
    1420 */
    1521package com.drew.metadata.exif;
    1622
    17 import com.drew.metadata.Directory;
    18 import com.drew.metadata.MetadataException;
     23import com.drew.lang.BufferBoundsException;
     24import com.drew.lang.BufferReader;
     25import com.drew.lang.ByteArrayReader;
     26import com.drew.lang.annotations.NotNull;
     27import com.drew.lang.annotations.Nullable;
     28import com.drew.metadata.Age;
     29import com.drew.metadata.Face;
    1930import com.drew.metadata.TagDescriptor;
    2031
     32import java.io.UnsupportedEncodingException;
     33
    2134/**
    22  * Provides human-readable string versions of the tags stored in a PanasonicMakernoteDirectory.
     35 * Provides human-readable string representations of tag values stored in a <code>PanasonicMakernoteDirectory</code>.
     36 * <p/>
     37 * Some information about this makernote taken from here:
     38 * <ul>
     39 * <li><a href="http://www.ozhiker.com/electronics/pjmt/jpeg_info/panasonic_mn.html">http://www.ozhiker.com/electronics/pjmt/jpeg_info/panasonic_mn.html</a></li>
     40 * <li><a href="http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Panasonic.html">http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Panasonic.html</a></li>
     41 * </ul>
    2342 *
    24  * Some information about this makernote taken from here:
    25  * http://www.ozhiker.com/electronics/pjmt/jpeg_info/panasonic_mn.html
     43 * @author Drew Noakes http://drewnoakes.com, Philipp Sandhaus
    2644 */
    27 public class PanasonicMakernoteDescriptor extends TagDescriptor
     45public class PanasonicMakernoteDescriptor extends TagDescriptor<PanasonicMakernoteDirectory>
    2846{
    29     public PanasonicMakernoteDescriptor(Directory directory)
     47    public PanasonicMakernoteDescriptor(@NotNull PanasonicMakernoteDirectory directory)
    3048    {
    3149        super(directory);
    3250    }
    3351
    34     public String getDescription(int tagType) throws MetadataException
    35     {
    36         switch (tagType)
     52    @Nullable
     53    public String getDescription(int tagType)
     54    {
     55        switch (tagType) {
     56            case PanasonicMakernoteDirectory.TAG_QUALITY_MODE:
     57                return getQualityModeDescription();
     58            case PanasonicMakernoteDirectory.TAG_VERSION:
     59                return getVersionDescription();
     60            case PanasonicMakernoteDirectory.TAG_WHITE_BALANCE:
     61                return getWhiteBalanceDescription();
     62            case PanasonicMakernoteDirectory.TAG_FOCUS_MODE:
     63                return getFocusModeDescription();
     64            case PanasonicMakernoteDirectory.TAG_AF_AREA_MODE:
     65                return getAfAreaModeDescription();
     66            case PanasonicMakernoteDirectory.TAG_IMAGE_STABILIZATION:
     67                return getImageStabilizationDescription();
     68            case PanasonicMakernoteDirectory.TAG_MACRO_MODE:
     69                return getMacroModeDescription();
     70            case PanasonicMakernoteDirectory.TAG_RECORD_MODE:
     71                return getRecordModeDescription();
     72            case PanasonicMakernoteDirectory.TAG_AUDIO:
     73                return getAudioDescription();
     74            case PanasonicMakernoteDirectory.TAG_UNKNOWN_DATA_DUMP:
     75                return getUnknownDataDumpDescription();
     76            case PanasonicMakernoteDirectory.TAG_COLOR_EFFECT:
     77                return getColorEffectDescription();
     78            case PanasonicMakernoteDirectory.TAG_UPTIME:
     79                return getUptimeDescription();
     80            case PanasonicMakernoteDirectory.TAG_BURST_MODE:
     81                return getBurstModeDescription();
     82            case PanasonicMakernoteDirectory.TAG_CONTRAST_MODE:
     83                return getContrastModeDescription();
     84            case PanasonicMakernoteDirectory.TAG_NOISE_REDUCTION:
     85                return getNoiseReductionDescription();
     86            case PanasonicMakernoteDirectory.TAG_SELF_TIMER:
     87                return getSelfTimerDescription();
     88            case PanasonicMakernoteDirectory.TAG_ROTATION:
     89                return getRotationDescription();
     90            case PanasonicMakernoteDirectory.TAG_AF_ASSIST_LAMP:
     91                return getAfAssistLampDescription();
     92            case PanasonicMakernoteDirectory.TAG_COLOR_MODE:
     93                return getColorModeDescription();
     94            case PanasonicMakernoteDirectory.TAG_OPTICAL_ZOOM_MODE:
     95                return getOpticalZoomModeDescription();
     96            case PanasonicMakernoteDirectory.TAG_CONVERSION_LENS:
     97                return getConversionLensDescription();
     98            case PanasonicMakernoteDirectory.TAG_CONTRAST:
     99                return getContrastDescription();
     100            case PanasonicMakernoteDirectory.TAG_WORLD_TIME_LOCATION:
     101                return getWorldTimeLocationDescription();
     102            case PanasonicMakernoteDirectory.TAG_ADVANCED_SCENE_MODE:
     103                return getAdvancedSceneModeDescription();
     104            case PanasonicMakernoteDirectory.TAG_FACE_DETECTION_INFO:
     105                return getDetectedFacesDescription();
     106            case PanasonicMakernoteDirectory.TAG_TRANSFORM:
     107                return getTransformDescription();
     108                        case PanasonicMakernoteDirectory.TAG_TRANSFORM_1:
     109                    return getTransform1Description();
     110            case PanasonicMakernoteDirectory.TAG_INTELLIGENT_EXPOSURE:
     111                return getIntelligentExposureDescription();
     112            case PanasonicMakernoteDirectory.TAG_FLASH_WARNING:
     113                return getFlashWarningDescription();
     114            case PanasonicMakernoteDirectory.TAG_COUNTRY:
     115                return getCountryDescription();
     116            case PanasonicMakernoteDirectory.TAG_STATE:
     117                return getStateDescription();
     118            case PanasonicMakernoteDirectory.TAG_CITY:
     119                return getCityDescription();
     120            case PanasonicMakernoteDirectory.TAG_LANDMARK:
     121                return getLandmarkDescription();
     122            case PanasonicMakernoteDirectory.TAG_INTELLIGENT_RESOLUTION:
     123                return getIntelligentResolutionDescription();
     124            case PanasonicMakernoteDirectory.TAG_FACE_RECOGNITION_INFO:
     125                return getRecognizedFacesDescription();
     126            case PanasonicMakernoteDirectory.TAG_PRINT_IMAGE_MATCHING_INFO:
     127                return getPrintImageMatchingInfoDescription();
     128            case PanasonicMakernoteDirectory.TAG_SCENE_MODE:
     129                return getSceneModeDescription();
     130            case PanasonicMakernoteDirectory.TAG_FLASH_FIRED:
     131                return getFlashFiredDescription();
     132            case PanasonicMakernoteDirectory.TAG_TEXT_STAMP:
     133                        return getTextStampDescription();
     134                        case PanasonicMakernoteDirectory.TAG_TEXT_STAMP_1:
     135                     return getTextStamp1Description();
     136                        case PanasonicMakernoteDirectory.TAG_TEXT_STAMP_2:
     137                         return getTextStamp2Description();
     138                        case PanasonicMakernoteDirectory.TAG_TEXT_STAMP_3:
     139                             return getTextStamp3Description();
     140            case PanasonicMakernoteDirectory.TAG_MAKERNOTE_VERSION:
     141                return getMakernoteVersionDescription();
     142            case PanasonicMakernoteDirectory.TAG_EXIF_VERSION:
     143                return getExifVersionDescription();
     144            case PanasonicMakernoteDirectory.TAG_INTERNAL_SERIAL_NUMBER:
     145                return getInternalSerialNumberDescription();
     146            case PanasonicMakernoteDirectory.TAG_TITLE:
     147                    return getTitleDescription();
     148                        case PanasonicMakernoteDirectory.TAG_BABY_NAME:
     149                    return getBabyNameDescription();
     150                        case PanasonicMakernoteDirectory.TAG_LOCATION:
     151                    return getLocationDescription();
     152                        case PanasonicMakernoteDirectory.TAG_BABY_AGE:
     153                        return getBabyAgeDescription();
     154                        case PanasonicMakernoteDirectory.TAG_BABY_AGE_1:
     155                        return getBabyAge1Description();
     156                        default:
     157                return super.getDescription(tagType);
     158        }
     159    }
     160
     161    @Nullable
     162    public String getPrintImageMatchingInfoDescription()
     163    {
     164        byte[] values = _directory.getByteArray(PanasonicMakernoteDirectory.TAG_PRINT_IMAGE_MATCHING_INFO);
     165        if (values == null)
     166            return null;
     167        return "(" + values.length + " bytes)";
     168    }
     169
     170    @Nullable
     171    public String getTextStampDescription()
     172    {
     173        return getOnOffDescription(PanasonicMakernoteDirectory.TAG_TEXT_STAMP);
     174    }
     175
     176        @Nullable
     177    public String getTextStamp1Description()
     178    {
     179        return getOnOffDescription(PanasonicMakernoteDirectory.TAG_TEXT_STAMP_1);
     180    }
     181
     182        @Nullable
     183    public String getTextStamp2Description()
     184    {
     185        return getOnOffDescription(PanasonicMakernoteDirectory.TAG_TEXT_STAMP_2);
     186    }
     187
     188        @Nullable
     189    public String getTextStamp3Description()
     190    {
     191        return getOnOffDescription(PanasonicMakernoteDirectory.TAG_TEXT_STAMP_3);
     192    }
     193
     194        @Nullable
     195    public String getMacroModeDescription()
     196    {
     197        return getOnOffDescription(PanasonicMakernoteDirectory.TAG_MACRO_MODE);
     198    }
     199
     200    @Nullable
     201    public String getFlashFiredDescription()
     202    {
     203        return getOnOffDescription(PanasonicMakernoteDirectory.TAG_FLASH_FIRED);
     204    }
     205
     206    @Nullable
     207    public String getImageStabilizationDescription()
     208    {
     209        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_IMAGE_STABILIZATION);
     210        if (value == null)
     211            return null;
     212        switch (value) {
     213            case 2:
     214                return "On, Mode 1";
     215            case 3:
     216                return "Off";
     217            case 4:
     218                return "On, Mode 2";
     219            default:
     220                return "Unknown (" + value + ")";
     221        }
     222    }
     223
     224    @Nullable
     225    public String getAudioDescription()
     226    {
     227        return getOnOffDescription(PanasonicMakernoteDirectory.TAG_AUDIO);
     228    }
     229
     230    @Nullable
     231    public String getTransformDescription()
     232    {
     233        return getTransformDescription(PanasonicMakernoteDirectory.TAG_TRANSFORM);
     234    }
     235
     236    @Nullable
     237    public String getTransform1Description()
     238    {
     239        return getTransformDescription(PanasonicMakernoteDirectory.TAG_TRANSFORM_1);
     240    }
     241
     242    @Nullable
     243    private String getTransformDescription(int tag)
     244    {
     245        byte[] values = _directory.getByteArray(tag);
     246        if (values == null)
     247            return null;
     248
     249        BufferReader reader = new ByteArrayReader(values);
     250
     251        try
    37252        {
    38             case PanasonicMakernoteDirectory.TAG_PANASONIC_MACRO_MODE:
    39                 return getMacroModeDescription();
    40             case PanasonicMakernoteDirectory.TAG_PANASONIC_RECORD_MODE:
    41                 return getRecordModeDescription();
    42             case PanasonicMakernoteDirectory.TAG_PANASONIC_PRINT_IMAGE_MATCHING_INFO:
    43                 return getPrintImageMatchingInfoDescription();
    44             default:
    45                 return _directory.getString(tagType);
    46         }
    47     }
    48 
    49     public String getPrintImageMatchingInfoDescription() throws MetadataException
    50     {
    51         if (!_directory.containsTag(PanasonicMakernoteDirectory.TAG_PANASONIC_PRINT_IMAGE_MATCHING_INFO)) return null;
    52         byte[] bytes = _directory.getByteArray(PanasonicMakernoteDirectory.TAG_PANASONIC_PRINT_IMAGE_MATCHING_INFO);
    53         return "(" + bytes.length + " bytes)";
    54     }
    55 
    56     public String getMacroModeDescription() throws MetadataException
    57     {
    58         if (!_directory.containsTag(PanasonicMakernoteDirectory.TAG_PANASONIC_MACRO_MODE)) return null;
    59         int value = _directory.getInt(PanasonicMakernoteDirectory.TAG_PANASONIC_MACRO_MODE);
    60         switch (value) {
    61             case 1:
     253            int val1 = reader.getUInt16(0);
     254            int val2 = reader.getUInt16(2);
     255
     256            if (val1 == -1 && val2 == 1)
     257                return "Slim Low";
     258            if (val1 == -3 && val2 == 2)
     259                return "Slim High";
     260            if (val1 == 0 && val2 == 0)
     261                return "Off";
     262            if (val1 == 1 && val2 == 1)
     263                return "Stretch Low";
     264            if (val1 == 3 && val2 == 2)
     265                return "Stretch High";
     266
     267            return "Unknown (" + val1 + " " + val2 + ")";
     268        } catch (BufferBoundsException e) {
     269            return null   ;
     270        }
     271    }
     272
     273    @Nullable
     274    public String getIntelligentExposureDescription()
     275    {
     276        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_INTELLIGENT_EXPOSURE);
     277        if (value == null)
     278            return null;
     279        switch (value) {
     280            case 0:
     281                return "Off";
     282            case 1:
     283                return "Low";
     284            case 2:
     285                return "Standard";
     286            case 3:
     287                return "High";
     288
     289            default:
     290                return "Unknown (" + value + ")";
     291        }
     292    }
     293
     294    @Nullable
     295    public String getFlashWarningDescription()
     296    {
     297        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_FLASH_WARNING);
     298        if (value == null)
     299            return null;
     300        switch (value) {
     301            case 0:
     302                return "No";
     303            case 1:
     304                return "Yes (Flash required but disabled)";
     305            default:
     306                return "Unknown (" + value + ")";
     307        }
     308    }
     309       
     310    @Nullable
     311    public String getCountryDescription()
     312    {
     313        return getTextDescription(PanasonicMakernoteDirectory.TAG_COUNTRY);
     314    }
     315
     316    @Nullable
     317    public String getStateDescription()
     318    {
     319        return getTextDescription(PanasonicMakernoteDirectory.TAG_STATE);
     320    }
     321
     322    @Nullable
     323    public String getCityDescription()
     324    {
     325        return getTextDescription(PanasonicMakernoteDirectory.TAG_CITY);
     326    }
     327
     328    @Nullable
     329    public String getLandmarkDescription()
     330    {
     331        return getTextDescription(PanasonicMakernoteDirectory.TAG_LANDMARK);
     332    }
     333
     334        @Nullable
     335    public String getTitleDescription()
     336    {
     337        return getTextDescription(PanasonicMakernoteDirectory.TAG_TITLE);
     338    }
     339
     340        @Nullable
     341    public String getBabyNameDescription()
     342    {
     343        return getTextDescription(PanasonicMakernoteDirectory.TAG_BABY_NAME);
     344    }
     345
     346        @Nullable
     347    public String getLocationDescription()
     348    {
     349        return getTextDescription(PanasonicMakernoteDirectory.TAG_LOCATION);
     350    }
     351
     352    @Nullable
     353    public String getIntelligentResolutionDescription()
     354    {
     355        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_INTELLIGENT_RESOLUTION);
     356        if (value == null)
     357            return null;
     358        switch (value) {
     359            case 0:
     360                return "Off";
     361            case 2:
     362                return "Auto";
     363            case 3:
    62364                return "On";
    63             case 2:
     365            default:
     366                return "Unknown (" + value + ")";
     367        }
     368    }
     369
     370    @Nullable
     371    public String getContrastDescription()
     372    {
     373        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_CONTRAST);
     374        if (value == null)
     375            return null;
     376        switch (value) {
     377            case 0:
     378                return "Normal";
     379            default:
     380                return "Unknown (" + value + ")";
     381        }
     382    }
     383
     384    @Nullable
     385    public String getWorldTimeLocationDescription()
     386    {
     387        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_WORLD_TIME_LOCATION);
     388        if (value == null)
     389            return null;
     390        switch (value) {
     391            case 1:
     392                return "Home";
     393            case 2:
     394                return "Destination";
     395            default:
     396                return "Unknown (" + value + ")";
     397        }
     398    }
     399
     400    @Nullable
     401    public String getAdvancedSceneModeDescription()
     402    {
     403        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_ADVANCED_SCENE_MODE);
     404        if (value == null)
     405            return null;
     406        switch (value) {
     407            case 1:
     408                return "Normal";
     409            case 2:
     410                return "Outdoor/Illuminations/Flower/HDR Art";
     411            case 3:
     412                return "Indoor/Architecture/Objects/HDR B&W";
     413            case 4:
     414                return "Creative";
     415            case 5:
     416                return "Auto";
     417            case 7:
     418                return "Expressive";
     419            case 8:
     420                return "Retro";
     421            case 9:
     422                return "Pure";
     423            case 10:
     424                return "Elegant";
     425            case 12:
     426                return "Monochrome";
     427            case 13:
     428                return "Dynamic Art";
     429            case 14:
     430                return "Silhouette";
     431            default:
     432                return "Unknown (" + value + ")";
     433        }
     434    }
     435
     436    @Nullable
     437    public String getUnknownDataDumpDescription()
     438    {
     439        byte[] value = _directory.getByteArray(PanasonicMakernoteDirectory.TAG_UNKNOWN_DATA_DUMP);
     440        if (value == null)
     441            return null;
     442        return "[" + value.length + " bytes]";
     443    }
     444
     445    @Nullable
     446    public String getColorEffectDescription()
     447    {
     448        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_COLOR_EFFECT);
     449        if (value == null)
     450            return null;
     451        switch (value) {
     452            case 1:
    64453                return "Off";
    65             default:
    66                 return "Unknown (" + value + ")";
    67         }
    68     }
    69 
    70     public String getRecordModeDescription() throws MetadataException
    71     {
    72         if (!_directory.containsTag(PanasonicMakernoteDirectory.TAG_PANASONIC_RECORD_MODE)) return null;
    73         int value = _directory.getInt(PanasonicMakernoteDirectory.TAG_PANASONIC_RECORD_MODE);
    74         switch (value) {
    75             case 1:
     454            case 2:
     455                return "Warm";
     456            case 3:
     457                return "Cool";
     458            case 4:
     459                return "Black & White";
     460            case 5:
     461                return "Sepia";
     462            default:
     463                return "Unknown (" + value + ")";
     464        }
     465    }
     466
     467    @Nullable
     468    public String getUptimeDescription()
     469    {
     470        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_UPTIME);
     471        if (value == null)
     472            return null;
     473        return value / 100f + " s";
     474    }
     475
     476    @Nullable
     477    public String getBurstModeDescription()
     478    {
     479        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_BURST_MODE);
     480        if (value == null)
     481            return null;
     482        switch (value) {
     483            case 0:
     484                return "Off";
     485            case 1:
     486                return "On";
     487            case 2:
     488                return "Infinite";
     489            case 4:
     490                return "Unlimited";
     491            default:
     492                return "Unknown (" + value + ")";
     493        }
     494    }
     495
     496    @Nullable
     497    public String getContrastModeDescription()
     498    {
     499        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_CONTRAST_MODE);
     500        if (value == null)
     501            return null;
     502        switch (value) {
     503            case 0x0:
    76504                return "Normal";
     505            case 0x1:
     506                return "Low";
     507            case 0x2:
     508                return "High";
     509            case 0x6:
     510                return "Medium Low";
     511            case 0x7:
     512                return "Medium High";
     513            case 0x100:
     514                return "Low";
     515            case 0x110:
     516                return "Normal";
     517            case 0x120:
     518                return "High";
     519
     520            default:
     521                return "Unknown (" + value + ")";
     522        }
     523    }
     524
     525    @Nullable
     526    public String getNoiseReductionDescription()
     527    {
     528        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_NOISE_REDUCTION);
     529        if (value == null)
     530            return null;
     531        switch (value) {
     532            case 0:
     533                return "Standard (0)";
     534            case 1:
     535                return "Low (-1)";
     536            case 2:
     537                return "High (+1)";
     538            case 3:
     539                return "Lowest (-2)";
     540            case 4:
     541                return "Highest (+2)";
     542            default:
     543                return "Unknown (" + value + ")";
     544        }
     545    }
     546
     547
     548    @Nullable
     549    public String getSelfTimerDescription()
     550    {
     551        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_SELF_TIMER);
     552        if (value == null)
     553            return null;
     554        switch (value) {
     555            case 1:
     556                return "Off";
     557            case 2:
     558                return "10 s";
     559            case 3:
     560                return "2 s";
     561            default:
     562                return "Unknown (" + value + ")";
     563        }
     564    }
     565
     566    @Nullable
     567    public String getRotationDescription()
     568    {
     569        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_ROTATION);
     570        if (value == null)
     571            return null;
     572        switch (value) {
     573            case 1:
     574                return "Horizontal";
     575            case 3:
     576                return "Rotate 180";
     577            case 6:
     578                return "Rotate 90 CW";
     579            case 8:
     580                return "Rotate 270 CW";
     581            default:
     582                return "Unknown (" + value + ")";
     583        }
     584    }
     585
     586    @Nullable
     587    public String getAfAssistLampDescription()
     588    {
     589        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_AF_ASSIST_LAMP);
     590        if (value == null)
     591            return null;
     592        switch (value) {
     593            case 1:
     594                return "Fired";
     595            case 2:
     596                return "Enabled but not used";
     597            case 3:
     598                return "Disabled but required";
     599            case 4:
     600                return "Disabled and not required";
     601            default:
     602                return "Unknown (" + value + ")";
     603        }
     604    }
     605
     606    @Nullable
     607    public String getColorModeDescription()
     608    {
     609        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_COLOR_MODE);
     610        if (value == null)
     611            return null;
     612        switch (value) {
     613            case 0:
     614                return "Normal";
     615            case 1:
     616                return "Natural";
     617            case 2:
     618                return "Vivid";
     619            default:
     620                return "Unknown (" + value + ")";
     621        }
     622    }
     623
     624    @Nullable
     625    public String getOpticalZoomModeDescription()
     626    {
     627        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_OPTICAL_ZOOM_MODE);
     628        if (value == null)
     629            return null;
     630        switch (value) {
     631            case 1:
     632                return "Standard";
     633            case 2:
     634                return "Extended";
     635            default:
     636                return "Unknown (" + value + ")";
     637        }
     638    }
     639
     640    @Nullable
     641    public String getConversionLensDescription()
     642    {
     643        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_CONVERSION_LENS);
     644        if (value == null)
     645            return null;
     646        switch (value) {
     647            case 1:
     648                return "Off";
     649            case 2:
     650                return "Wide";
     651            case 3:
     652                return "Telephoto";
     653            case 4:
     654                return "Macro";
     655            default:
     656                return "Unknown (" + value + ")";
     657        }
     658    }
     659
     660    @Nullable
     661    public String getDetectedFacesDescription()
     662    {
     663        return buildFacesDescription(_directory.getDetectedFaces());
     664    }
     665
     666    @Nullable
     667    public String getRecognizedFacesDescription()
     668    {
     669        return buildFacesDescription(_directory.getRecognizedFaces());
     670    }
     671
     672    @Nullable
     673    private String buildFacesDescription(@Nullable Face[] faces)
     674    {
     675        if (faces == null)
     676            return null;
     677
     678        StringBuilder result = new StringBuilder();
     679
     680        for (int i = 0; i < faces.length; i++)
     681            result.append("Face ").append(i + 1).append(": ").append(faces[i].toString()).append("\n");
     682
     683        if (result.length() > 0)
     684            return result.substring(0, result.length() - 1);
     685
     686        return null;
     687    }
     688
     689    @Nullable
     690    public String getRecordModeDescription()
     691    {
     692        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_RECORD_MODE);
     693        if (value == null)
     694            return null;
     695        switch (value) {
     696            case 1:
     697                return "Normal";
    77698            case 2:
    78699                return "Portrait";
     700            case 3:
     701                return "Scenery";
     702            case 4:
     703                return "Sports";
     704            case 5:
     705                return "Night Portrait";
     706            case 6:
     707                return "Program";
     708            case 7:
     709                return "Aperture Priority";
     710            case 8:
     711                return "Shutter Priority";
    79712            case 9:
    80713                return "Macro";
     714            case 10:
     715                return "Spot";
     716            case 11:
     717                return "Manual";
     718            case 12:
     719                return "Movie Preview";
     720            case 13:
     721                return "Panning";
     722            case 14:
     723                return "Simple";
     724            case 15:
     725                return "Color Effects";
     726            case 16:
     727                return "Self Portrait";
     728            case 17:
     729                return "Economy";
     730            case 18:
     731                return "Fireworks";
     732            case 19:
     733                return "Party";
     734            case 20:
     735                return "Snow";
     736            case 21:
     737                return "Night Scenery";
     738            case 22:
     739                return "Food";
     740            case 23:
     741                return "Baby";
     742            case 24:
     743                return "Soft Skin";
     744            case 25:
     745                return "Candlelight";
     746            case 26:
     747                return "Starry Night";
     748            case 27:
     749                return "High Sensitivity";
     750            case 28:
     751                return "Panorama Assist";
     752            case 29:
     753                return "Underwater";
     754            case 30:
     755                return "Beach";
     756            case 31:
     757                return "Aerial Photo";
     758            case 32:
     759                return "Sunset";
     760            case 33:
     761                return "Pet";
     762            case 34:
     763                return "Intelligent ISO";
     764            case 35:
     765                return "Clipboard";
     766            case 36:
     767                return "High Speed Continuous Shooting";
     768            case 37:
     769                return "Intelligent Auto";
     770            case 39:
     771                return "Multi-aspect";
     772            case 41:
     773                return "Transform";
     774            case 42:
     775                return "Flash Burst";
     776            case 43:
     777                return "Pin Hole";
     778            case 44:
     779                return "Film Grain";
     780            case 45:
     781                return "My Color";
     782            case 46:
     783                return "Photo Frame";
     784            case 51:
     785                return "HDR";
     786            default:
     787                return "Unknown (" + value + ")";
     788        }
     789    }
     790
     791    @Nullable
     792    public String getSceneModeDescription()
     793    {
     794        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_SCENE_MODE);
     795        if (value == null)
     796            return null;
     797        switch (value) {
     798            case 1:
     799                return "Normal";
     800            case 2:
     801                return "Portrait";
     802            case 3:
     803                return "Scenery";
     804            case 4:
     805                return "Sports";
     806            case 5:
     807                return "Night Portrait";
     808            case 6:
     809                return "Program";
     810            case 7:
     811                return "Aperture Priority";
     812            case 8:
     813                return "Shutter Priority";
     814            case 9:
     815                return "Macro";
     816            case 10:
     817                return "Spot";
     818            case 11:
     819                return "Manual";
     820            case 12:
     821                return "Movie Preview";
     822            case 13:
     823                return "Panning";
     824            case 14:
     825                return "Simple";
     826            case 15:
     827                return "Color Effects";
     828            case 16:
     829                return "Self Portrait";
     830            case 17:
     831                return "Economy";
     832            case 18:
     833                return "Fireworks";
     834            case 19:
     835                return "Party";
     836            case 20:
     837                return "Snow";
     838            case 21:
     839                return "Night Scenery";
     840            case 22:
     841                return "Food";
     842            case 23:
     843                return "Baby";
     844            case 24:
     845                return "Soft Skin";
     846            case 25:
     847                return "Candlelight";
     848            case 26:
     849                return "Starry Night";
     850            case 27:
     851                return "High Sensitivity";
     852            case 28:
     853                return "Panorama Assist";
     854            case 29:
     855                return "Underwater";
     856            case 30:
     857                return "Beach";
     858            case 31:
     859                return "Aerial Photo";
     860            case 32:
     861                return "Sunset";
     862            case 33:
     863                return "Pet";
     864            case 34:
     865                return "Intelligent ISO";
     866            case 35:
     867                return "Clipboard";
     868            case 36:
     869                return "High Speed Continuous Shooting";
     870            case 37:
     871                return "Intelligent Auto";
     872            case 39:
     873                return "Multi-aspect";
     874            case 41:
     875                return "Transform";
     876            case 42:
     877                return "Flash Burst";
     878            case 43:
     879                return "Pin Hole";
     880            case 44:
     881                return "Film Grain";
     882            case 45:
     883                return "My Color";
     884            case 46:
     885                return "Photo Frame";
     886            case 51:
     887                return "HDR";
     888            default:
     889                return "Unknown (" + value + ")";
     890        }
     891    }
     892
     893    @Nullable
     894    public String getFocusModeDescription()
     895    {
     896        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_FOCUS_MODE);
     897        if (value == null)
     898            return null;
     899        switch (value) {
     900            case 1:
     901                return "Auto";
     902            case 2:
     903                return "Manual";
     904            case 4:
     905                return "Auto, Focus Button";
     906            case 5:
     907                return "Auto, Continuous";
     908            default:
     909                return "Unknown (" + value + ")";
     910        }
     911    }
     912
     913    @Nullable
     914    public String getAfAreaModeDescription()
     915    {
     916        int[] value = _directory.getIntArray(PanasonicMakernoteDirectory.TAG_AF_AREA_MODE);
     917        if (value == null || value.length < 2)
     918            return null;
     919        switch (value[0]) {
     920            case 0:
     921                switch (value[1]) {
     922                    case 1:
     923                        return "Spot Mode On";
     924                    case 16:
     925                        return "Spot Mode Off";
     926                    default:
     927                        return "Unknown (" + value[0] + " " + value[1] + ")";
     928                }
     929            case 1:
     930                switch (value[1]) {
     931                    case 0:
     932                        return "Spot Focusing";
     933                    case 1:
     934                        return "5-area";
     935                    default:
     936                        return "Unknown (" + value[0] + " " + value[1] + ")";
     937                }
     938            case 16:
     939                switch (value[1]) {
     940                    case 0:
     941                        return "1-area";
     942                    case 16:
     943                        return "1-area (high speed)";
     944                    default:
     945                        return "Unknown (" + value[0] + " " + value[1] + ")";
     946                }
     947            case 32:
     948                switch (value[1]) {
     949                    case 0:
     950                        return "Auto or Face Detect";
     951                    case 1:
     952                        return "3-area (left)";
     953                    case 2:
     954                        return "3-area (center)";
     955                    case 3:
     956                        return "3-area (right)";
     957                    default:
     958                        return "Unknown (" + value[0] + " " + value[1] + ")";
     959                }
     960            case 64:
     961                return "Face Detect";
     962            default:
     963                return "Unknown (" + value[0] + " " + value[1] + ")";
     964        }
     965    }
     966
     967    @Nullable
     968    public String getQualityModeDescription()
     969    {
     970        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_QUALITY_MODE);
     971        if (value == null)
     972            return null;
     973        switch (value) {
     974            case 2:
     975                return "High";
     976            case 3:
     977                return "Normal";
     978            case 6:
     979                return "Very High";
     980            case 7:
     981                return "Raw";
     982            case 9:
     983                return "Motion Picture";
     984            default:
     985                return "Unknown (" + value + ")";
     986        }
     987    }
     988
     989    @Nullable
     990    public String getVersionDescription()
     991    {
     992        return convertBytesToVersionString(_directory.getIntArray(PanasonicMakernoteDirectory.TAG_VERSION), 2);
     993    }
     994
     995    @Nullable
     996    public String getMakernoteVersionDescription()
     997    {
     998        return convertBytesToVersionString(_directory.getIntArray(PanasonicMakernoteDirectory.TAG_MAKERNOTE_VERSION), 2);
     999    }
     1000
     1001    @Nullable
     1002    public String getExifVersionDescription()
     1003    {
     1004        return convertBytesToVersionString(_directory.getIntArray(PanasonicMakernoteDirectory.TAG_EXIF_VERSION), 2);
     1005    }
     1006
     1007    @Nullable
     1008    public String getInternalSerialNumberDescription()
     1009    {
     1010        final byte[] bytes = _directory.getByteArray(PanasonicMakernoteDirectory.TAG_INTERNAL_SERIAL_NUMBER);
     1011
     1012        if (bytes==null)
     1013            return null;
     1014
     1015        int length = bytes.length;
     1016        for (int index = 0; index < bytes.length; index++) {
     1017            int i = bytes[index] & 0xFF;
     1018            if (i == 0 || i > 0x7F) {
     1019                length = index;
     1020                break;
     1021            }
     1022        }
     1023
     1024        return new String(bytes, 0, length);
     1025    }
     1026
     1027    @Nullable
     1028    public String getWhiteBalanceDescription()
     1029    {
     1030        Integer value = _directory.getInteger(PanasonicMakernoteDirectory.TAG_WHITE_BALANCE);
     1031        if (value == null)
     1032            return null;
     1033        switch (value) {
     1034            case 1:
     1035                return "Auto";
     1036            case 2:
     1037                return "Daylight";
     1038            case 3:
     1039                return "Cloudy";
     1040            case 4:
     1041                return "Incandescent";
     1042            case 5:
     1043                return "Manual";
     1044            case 8:
     1045                return "Flash";
     1046            case 10:
     1047                return "Black & White";
     1048            case 11:
     1049                return "Manual";
     1050            case 12:
     1051                return "Shade";
     1052            default:
     1053                return "Unknown (" + value + ")";
     1054        }
     1055    }
     1056
     1057        @Nullable
     1058        public String getBabyAgeDescription()
     1059    {
     1060        final Age age = _directory.getAge(PanasonicMakernoteDirectory.TAG_BABY_AGE);
     1061        if (age==null)
     1062            return null;
     1063        return age.toFriendlyString();
     1064        }
     1065       
     1066        @Nullable
     1067        public String getBabyAge1Description()
     1068    {
     1069        final Age age = _directory.getAge(PanasonicMakernoteDirectory.TAG_BABY_AGE_1);
     1070        if (age==null)
     1071            return null;
     1072        return age.toFriendlyString();
     1073        }
     1074
     1075        @Nullable
     1076        private String getTextDescription(int tag)
     1077    {
     1078                byte[] values = _directory.getByteArray(tag);
     1079        if (values == null)
     1080            return null;
     1081        try {
     1082            return new String(values, "ASCII").trim();
     1083        } catch (UnsupportedEncodingException e) {
     1084            return null;
     1085        }
     1086        }
     1087
     1088    @Nullable
     1089    private String getOnOffDescription(int tag)
     1090    {
     1091        Integer value = _directory.getInteger(tag);
     1092        if (value == null)
     1093            return null;
     1094        switch (value) {
     1095            case 1:
     1096                return "Off";
     1097            case 2:
     1098                return "On";
    811099            default:
    821100                return "Unknown (" + value + ")";
Note: See TracChangeset for help on using the changeset viewer.