blob: 104a47452193c7fdca9254c6a8f130630681f50c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.drill.exec.store.image;
import java.util.HashMap;
import com.drew.lang.annotations.NotNull;
import com.drew.metadata.Directory;
import com.drew.metadata.MetadataException;
public class GenericMetadataDirectory extends Directory
{
public static final int TAG_FILE_SIZE = 1;
public static final int TAG_FILE_DATE_TIME = 2;
public static final int TAG_FORMAT = 3;
public static final int TAG_PIXEL_WIDTH = 4;
public static final int TAG_PIXEL_HEIGHT = 5;
public static final int TAG_ORIENTATION = 6;
public static final int TAG_DPI_WIDTH = 7;
public static final int TAG_DPI_HEIGHT = 8;
public static final int TAG_COLOR_MODE = 9;
public static final int TAG_BITS_PER_PIXEL = 10;
public static final int TAG_HAS_ALPHA = 11;
public static final int TAG_DURATION = 12;
public static final int TAG_VIDEO_CODEC = 13;
public static final int TAG_FRAME_RATE = 14;
public static final int TAG_AUDIO_CODEC = 15;
public static final int TAG_AUDIO_SAMPLE_SIZE = 16;
public static final int TAG_AUDIO_SAMPLE_RATE = 17;
@NotNull
protected static final HashMap<Integer, String> _tagNameMap = new HashMap<>();
static {
_tagNameMap.put(TAG_FILE_SIZE, "File Size");
_tagNameMap.put(TAG_FILE_DATE_TIME, "File Date Time");
_tagNameMap.put(TAG_FORMAT, "Format");
_tagNameMap.put(TAG_PIXEL_WIDTH, "Pixel Width");
_tagNameMap.put(TAG_PIXEL_HEIGHT, "Pixel Height");
_tagNameMap.put(TAG_ORIENTATION, "Orientation");
_tagNameMap.put(TAG_DPI_WIDTH, "DPI Width");
_tagNameMap.put(TAG_DPI_HEIGHT, "DPI Height");
_tagNameMap.put(TAG_COLOR_MODE, "Color Mode");
_tagNameMap.put(TAG_BITS_PER_PIXEL, "Bits Per Pixel");
_tagNameMap.put(TAG_HAS_ALPHA, "Has Alpha");
_tagNameMap.put(TAG_DURATION, "Duration");
_tagNameMap.put(TAG_VIDEO_CODEC, "Video Codec");
_tagNameMap.put(TAG_FRAME_RATE, "Frame Rate");
_tagNameMap.put(TAG_AUDIO_CODEC, "Audio Codec");
_tagNameMap.put(TAG_AUDIO_SAMPLE_SIZE, "Audio Sample Size");
_tagNameMap.put(TAG_AUDIO_SAMPLE_RATE, "Audio Sample Rate");
}
public GenericMetadataDirectory()
{
this.setDescriptor(new GenericMetadataDescriptor(this));
}
@Override
@NotNull
public String getName()
{
return "Generic Metadata";
}
@Override
@NotNull
protected HashMap<Integer, String> getTagNameMap()
{
return _tagNameMap;
}
private void setIntIfEmpty(int tagType, int value) {
if (!containsTag(tagType)) {
setInt(tagType, value);
}
}
private void setLongIfEmpty(int tagType, long value) {
if (!containsTag(tagType)) {
setLong(tagType, value);
}
}
private void setBooleanIfEmpty(int tagType, boolean value) {
if (!containsTag(tagType)) {
setBoolean(tagType, value);
}
}
private void setDoubleIfEmpty(int tagType, double value) {
if (!containsTag(tagType)) {
setDouble(tagType, value);
}
}
private void setStringIfEmpty(int tagType, @NotNull String value) {
if (!containsTag(tagType)) {
setString(tagType, value);
}
}
public void setPixelWidth(int pixelWidth) {
setIntIfEmpty(TAG_PIXEL_WIDTH, pixelWidth);
}
public void setPixelWidth(Directory directory, int tagType) {
try {
setPixelWidth(directory.getInt(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setPixelHeight(int pixelHeight) {
setIntIfEmpty(TAG_PIXEL_HEIGHT, pixelHeight);
}
public void setPixelHeight(Directory directory, int tagType) {
try {
setPixelHeight(directory.getInt(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setOrientation(int orientation) {
setIntIfEmpty(TAG_ORIENTATION, orientation);
}
public void setOrientation(Directory directory, int tagType) {
try {
setOrientation(directory.getInt(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setDPIWidth(double dpiWidth) {
setDoubleIfEmpty(TAG_DPI_WIDTH, dpiWidth);
}
public void setDPIWidth(Directory directory, int tagType) {
try {
setDPIWidth(directory.getInt(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setDPIWidth(Directory directory, int tagType, double factor) {
try {
setDPIWidth(directory.getInt(tagType) * factor);
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setDPIHeight(double dpiHeight) {
setDoubleIfEmpty(TAG_DPI_HEIGHT, dpiHeight);
}
public void setDPIHeight(Directory directory, int tagType) {
try {
setDPIHeight(directory.getInt(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setDPIHeight(Directory directory, int tagType, double factor) {
try {
setDPIHeight(directory.getInt(tagType) * factor);
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setColorMode(String colorMode) {
setStringIfEmpty(TAG_COLOR_MODE, colorMode);
}
public void setColorMode(Directory directory, int tagType) {
String colorMode = directory.getDescription(tagType);
if (colorMode != null) {
setColorMode(colorMode);
}
}
public void setBitPerPixel(int bitPerPixel) {
setIntIfEmpty(TAG_BITS_PER_PIXEL, bitPerPixel);
}
public void setBitPerPixel(Directory directory, int tagType) {
try {
setBitPerPixel(directory.getInt(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setBitPerPixel(Directory directory, int tagType1, int tagType2) {
try {
setBitPerPixel(directory.getInt(tagType1) * directory.getInt(tagType2));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setAlpha(boolean alpha) {
setBooleanIfEmpty(TAG_HAS_ALPHA, alpha);
}
public void setAlpha(Directory directory, int tagType) {
try {
setAlpha(directory.getBoolean(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setDuration(long duration) {
setLongIfEmpty(TAG_DURATION, duration);
}
public void setDuration(Directory directory, int tagType) {
Object o = directory.getObject(tagType);
if (o != null) {
if (o instanceof String) {
String[] time = ((String) o).split(":");
setDuration(
Long.parseLong(time[0]) * 3600 +
Long.parseLong(time[1]) * 60 +
Long.parseLong(time[2]));
} else if (o instanceof Number) {
setDuration(((Number) o).longValue());
}
}
}
public void setVideoCodec(String videoCodec) {
setStringIfEmpty(TAG_VIDEO_CODEC, videoCodec);
}
public void setVideoCodec(Directory directory, int tagType) {
String videoCodec = directory.getString(tagType);
if (videoCodec != null) {
setVideoCodec(videoCodec);
}
}
public void setFrameRate(double frameRate) {
setDoubleIfEmpty(TAG_FRAME_RATE, frameRate);
}
public void setFrameRate(Directory directory, int tagType) {
try {
setFrameRate(directory.getDouble(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setAudioCodec(String audioCodec) {
setStringIfEmpty(TAG_AUDIO_CODEC, audioCodec);
}
public void setAudioCodec(Directory directory, int tagType) {
String audioCodec = directory.getString(tagType);
if (audioCodec != null) {
setAudioCodec(audioCodec);
}
}
public void setAudioSampleSize(int audioSampleSize) {
setIntIfEmpty(TAG_AUDIO_SAMPLE_SIZE, audioSampleSize);
}
public void setAudioSampleSize(Directory directory, int tagType) {
try {
setAudioSampleSize(directory.getInt(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
public void setAudioSampleRate(double audioSampleRate) {
setDoubleIfEmpty(TAG_AUDIO_SAMPLE_RATE, audioSampleRate);
}
public void setAudioSampleRate(Directory directory, int tagType) {
try {
setAudioSampleRate(directory.getDouble(tagType));
} catch (MetadataException e) {
// Nothing needs to be done
}
}
}