/*
* Copyright (C) 2011 in-somnia
*
* This file is part of JAAD.
*
* JAAD is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* JAAD is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
* Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library.
* If not, see <http://www.gnu.org/licenses/>.
*/
package net.sourceforge.jaad.mp4.boxes.impl;
import java.io.IOException;
import net.sourceforge.jaad.mp4.MP4InputStream;
import net.sourceforge.jaad.mp4.boxes.FullBox;
/**
* This box may be present in any visual sample entry. This box indicates the
* scaling method that is applied when the width and height of the visual
* material (as declared by the width and height values in any visual sample
* entry) do not match the track width and height values (as indicated in the
* track header box).
* Implementation of this box is optional; if this box is present and can be
* interpreted by the decoder, all samples shall be displayed according to the
* scaling behaviour that is specified in this box. Otherwise, all samples are
* scaled to the size that is indicated by the width and height field in the
* Track Header Box.
* If the size of the image is bigger than the size of the presentation region
* and 'hidden' scaling is applied in the Sample Scale Box, it is not possible
* to display the whole image. In such a case, it is useful to provide the
* information to determine the region that is to be displayed. The centre
* values would then indicate the centre of the region of high priority in each
* visual sample. The decoder can display the region of high priority according
* to these values. The centre values imply a consistent crop for all the images
* in a sequence. The offset values are positive when the desired visual centre
* is below or to the right of the image centre, and negative for offsets above
* or to the left.
*
* @author in-somnia
*/
public class SampleScaleBox extends FullBox {
private boolean constrained;
private int scaleMethod, displayCenterX, displayCenterY;
public SampleScaleBox() {
super("Sample Scale Box");
}
@Override
public void decode(MP4InputStream in) throws IOException {
super.decode(in);
//7 bits reserved, 1 bit flag
constrained = (in.read()&1)==1;
scaleMethod = in.read();
displayCenterX = (int) in.readBytes(2);
displayCenterY = (int) in.readBytes(2);
}
/**
* If this flag is set, all samples described by this sample entry shall be
* scaled according to the method specified by the field 'scale_method'.
* Otherwise, it is recommended that all the samples be scaled according to
* the method specified by the field 'scale_method', but can be displayed in
* an implementation dependent way, which may include not scaling the image
* (i.e. neither to the width and height specified in the track header box,
* nor by the method indicated here).
*
* @return true if the samples should be scaled by the scale method
*/
public boolean isConstrained() {
return constrained;
}
/**
* The horizontal offset in pixels of the centre of the region that should
* be displayed by priority relative to the centre of the image. Default
* value is zero. Positive values indicate a display centre to the right of
* the image centre.
*
* @return the horizontal offset
*/
public int getDisplayCenterX() {
return displayCenterX;
}
/**
* The vertical offset in pixels of the centre of the region that should be
* displayed by priority relative to the centre of the image. Default value
* is zero. Positive values indicate a display centre below the image
* centre.
* @return the vertical offset
*/
public int getDisplayCenterY() {
return displayCenterY;
}
/**
* The scale method is an integer that defines the scaling mode to be used.
* Of the 256 possible values the values 0 through 127 are reserved for use
* by ISO and values 128 through 255 are user-defined and are not specified
* in this International Standard; they may be used as determined by the
* application. Of the reserved values the following modes are currently
* defined:
* 1: scaling is done by 'fill' mode.
* 2: scaling is done by 'hidden' mode.
* 3: scaling is done by 'meet' mode.
* 4: scaling is done by 'slice' mode in the x-coordinate.
* 5: scaling is done by 'slice' mode in the y-coordinate.
*
* @return the scale method
*/
public int getScaleMethod() {
return scaleMethod;
}
}