Disable codec reuse when only crop rect changes

Work around a bug where MediaCodec fails to adapt between
formats that have the same decoded picture resolution but
different crop.

Add a playlist of two MP4 files that reproduce the issue.

This CL implements the workaround for H.265 and Mp4

PiperOrigin-RevId: 753976872
This commit is contained in:
dancho 2025-05-02 06:14:30 -07:00 committed by Copybara-Service
parent 52d9cfdcb7
commit ef39fc70d9
97 changed files with 368 additions and 10 deletions

View File

@ -618,6 +618,17 @@
"image_duration_ms": 2000
}
]
},
{
"name": "Change in crop b/409036359",
"playlist": [
{
"uri": "https://storage.googleapis.com/exoplayer-test-media-1/mp4/bbb_760x480_1mbps_60fps_hevc.mp4"
},
{
"uri": "https://storage.googleapis.com/exoplayer-test-media-1/mp4/bbb_760x480_1mbps_60fps_hevc_pad.mp4"
}
]
}
]
},

View File

@ -97,6 +97,8 @@ import java.util.UUID;
* <ul>
* <li>{@link #width}
* <li>{@link #height}
* <li>{@link #decodedWidth}
* <li>{@link #decodedHeight}
* <li>{@link #frameRate}
* <li>{@link #rotationDegrees}
* <li>{@link #pixelWidthHeightRatio}
@ -174,6 +176,8 @@ public final class Format {
private int width;
private int height;
private int decodedWidth;
private int decodedHeight;
private float frameRate;
private int rotationDegrees;
private float pixelWidthHeightRatio;
@ -216,6 +220,8 @@ public final class Format {
// Video specific.
width = NO_VALUE;
height = NO_VALUE;
decodedWidth = NO_VALUE;
decodedHeight = NO_VALUE;
frameRate = NO_VALUE;
pixelWidthHeightRatio = 1.0f;
stereoMode = NO_VALUE;
@ -265,6 +271,8 @@ public final class Format {
// Video specific.
this.width = format.width;
this.height = format.height;
this.decodedWidth = format.decodedWidth;
this.decodedHeight = format.decodedHeight;
this.frameRate = format.frameRate;
this.rotationDegrees = format.rotationDegrees;
this.pixelWidthHeightRatio = format.pixelWidthHeightRatio;
@ -588,6 +596,30 @@ public final class Format {
return this;
}
/**
* Sets {@link Format#decodedWidth}. The default value is {@link #NO_VALUE}.
*
* @param decodedWidth The {@link Format#decodedWidth}.
* @return The builder.
*/
@CanIgnoreReturnValue
public Builder setDecodedWidth(int decodedWidth) {
this.decodedWidth = decodedWidth;
return this;
}
/**
* Sets {@link Format#decodedHeight}. The default value is {@link #NO_VALUE}.
*
* @param decodedHeight The {@link Format#decodedHeight}.
* @return The builder.
*/
@CanIgnoreReturnValue
public Builder setDecodedHeight(int decodedHeight) {
this.decodedHeight = decodedHeight;
return this;
}
/**
* Sets {@link Format#frameRate}. The default value is {@link #NO_VALUE}.
*
@ -1000,6 +1032,22 @@ public final class Format {
/** The height of the video in pixels, or {@link #NO_VALUE} if unknown or not applicable. */
public final int height;
/**
* The width of the video decoded picture in pixels, or {@link #NO_VALUE} if unknown or not
* applicable.
*
* <p>May be larger than {@link #width} if cropping is applied before display.
*/
@UnstableApi public final int decodedWidth;
/**
* The height of the video decoded picture in pixels, or {@link #NO_VALUE} if unknown or not
* applicable.
*
* <p>May be larger than {@link #height} if cropping is applied before display.
*/
@UnstableApi public final int decodedHeight;
/** The frame rate in frames per second, or {@link #NO_VALUE} if unknown or not applicable. */
public final float frameRate;
@ -1145,6 +1193,8 @@ public final class Format {
// Video specific.
width = builder.width;
height = builder.height;
decodedWidth = builder.decodedWidth;
decodedHeight = builder.decodedHeight;
frameRate = builder.frameRate;
rotationDegrees = builder.rotationDegrees == NO_VALUE ? 0 : builder.rotationDegrees;
pixelWidthHeightRatio =
@ -1329,6 +1379,8 @@ public final class Format {
// Video specific.
result = 31 * result + width;
result = 31 * result + height;
result = 31 * result + decodedWidth;
result = 31 * result + decodedHeight;
result = 31 * result + Float.floatToIntBits(frameRate);
result = 31 * result + rotationDegrees;
result = 31 * result + Float.floatToIntBits(pixelWidthHeightRatio);
@ -1376,6 +1428,8 @@ public final class Format {
&& subsampleOffsetUs == other.subsampleOffsetUs
&& width == other.width
&& height == other.height
&& decodedWidth == other.decodedWidth
&& decodedHeight == other.decodedHeight
&& rotationDegrees == other.rotationDegrees
&& stereoMode == other.stereoMode
&& maxSubLayers == other.maxSubLayers
@ -1471,6 +1525,13 @@ public final class Format {
if (format.width != NO_VALUE && format.height != NO_VALUE) {
builder.append(", res=").append(format.width).append("x").append(format.height);
}
if (format.decodedWidth != NO_VALUE && format.decodedHeight != NO_VALUE) {
builder
.append(", decRes=")
.append(format.decodedWidth)
.append("x")
.append(format.decodedHeight);
}
if (!fuzzyEquals(format.pixelWidthHeightRatio, 1, 0.001)) {
builder.append(", par=").append(Util.formatInvariant("%.3f", format.pixelWidthHeightRatio));
}
@ -1555,6 +1616,8 @@ public final class Format {
private static final String FIELD_LABELS = Util.intToStringMaxRadix(32);
private static final String FIELD_AUXILIARY_TRACK_TYPE = Util.intToStringMaxRadix(33);
private static final String FIELD_MAX_SUB_LAYERS = Util.intToStringMaxRadix(34);
private static final String FIELD_DECODED_WIDTH = Util.intToStringMaxRadix(35);
private static final String FIELD_DECODED_HEIGHT = Util.intToStringMaxRadix(36);
/**
* Returns a {@link Bundle} representing the information stored in this object. If {@code
@ -1592,6 +1655,8 @@ public final class Format {
// Video specific.
bundle.putInt(FIELD_WIDTH, width);
bundle.putInt(FIELD_HEIGHT, height);
bundle.putInt(FIELD_DECODED_WIDTH, decodedWidth);
bundle.putInt(FIELD_DECODED_HEIGHT, decodedHeight);
bundle.putFloat(FIELD_FRAME_RATE, frameRate);
bundle.putInt(FIELD_ROTATION_DEGREES, rotationDegrees);
bundle.putFloat(FIELD_PIXEL_WIDTH_HEIGHT_RATIO, pixelWidthHeightRatio);
@ -1663,6 +1728,8 @@ public final class Format {
// Video specific.
.setWidth(bundle.getInt(FIELD_WIDTH, DEFAULT.width))
.setHeight(bundle.getInt(FIELD_HEIGHT, DEFAULT.height))
.setDecodedWidth(bundle.getInt(FIELD_DECODED_WIDTH, DEFAULT.decodedWidth))
.setDecodedHeight(bundle.getInt(FIELD_DECODED_HEIGHT, DEFAULT.decodedHeight))
.setFrameRate(bundle.getFloat(FIELD_FRAME_RATE, DEFAULT.frameRate))
.setRotationDegrees(bundle.getInt(FIELD_ROTATION_DEGREES, DEFAULT.rotationDegrees))
.setPixelWidthHeightRatio(

View File

@ -398,6 +398,8 @@ public final class NalUnitUtil {
public final int seqParameterSetId;
public final int width;
public final int height;
public final int decodedWidth;
public final int decodedHeight;
public final float pixelWidthHeightRatio;
public final int maxNumReorderPics;
public final @C.ColorSpace int colorSpace;
@ -414,6 +416,8 @@ public final class NalUnitUtil {
int seqParameterSetId,
int width,
int height,
int decodedWidth,
int decodedHeight,
float pixelWidthHeightRatio,
int maxNumReorderPics,
@C.ColorSpace int colorSpace,
@ -433,6 +437,8 @@ public final class NalUnitUtil {
this.colorSpace = colorSpace;
this.colorRange = colorRange;
this.colorTransfer = colorTransfer;
this.decodedWidth = decodedWidth;
this.decodedHeight = decodedHeight;
}
}
@ -1558,6 +1564,8 @@ public final class NalUnitUtil {
int chromaFormatIdc = 0;
int frameWidth = 0;
int frameHeight = 0;
int decodedWidth = 0;
int decodedHeight = 0;
int bitDepthLumaMinus8 = 0;
int bitDepthChromaMinus8 = 0;
int spsRepFormatIdx = C.INDEX_UNSET;
@ -1573,8 +1581,10 @@ public final class NalUnitUtil {
&& vpsData.repFormatsAndIndices.repFormats.size() > spsRepFormatIdx) {
H265RepFormat repFormat = vpsData.repFormatsAndIndices.repFormats.get(spsRepFormatIdx);
chromaFormatIdc = repFormat.chromaFormatIdc;
frameWidth = repFormat.width;
frameHeight = repFormat.height;
decodedWidth = repFormat.width;
decodedHeight = repFormat.height;
frameWidth = decodedWidth;
frameHeight = decodedHeight;
bitDepthLumaMinus8 = repFormat.bitDepthLumaMinus8;
bitDepthChromaMinus8 = repFormat.bitDepthChromaMinus8;
}
@ -1584,8 +1594,8 @@ public final class NalUnitUtil {
if (chromaFormatIdc == 3) {
data.skipBit(); // separate_colour_plane_flag
}
frameWidth = data.readUnsignedExpGolombCodedInt();
frameHeight = data.readUnsignedExpGolombCodedInt();
decodedWidth = data.readUnsignedExpGolombCodedInt();
decodedHeight = data.readUnsignedExpGolombCodedInt();
if (data.readBit()) { // conformance_window_flag
int confWinLeftOffset = data.readUnsignedExpGolombCodedInt();
int confWinRightOffset = data.readUnsignedExpGolombCodedInt();
@ -1593,10 +1603,13 @@ public final class NalUnitUtil {
int confWinBottomOffset = data.readUnsignedExpGolombCodedInt();
frameWidth =
applyConformanceWindowToWidth(
frameWidth, chromaFormatIdc, confWinLeftOffset, confWinRightOffset);
decodedWidth, chromaFormatIdc, confWinLeftOffset, confWinRightOffset);
frameHeight =
applyConformanceWindowToHeight(
frameHeight, chromaFormatIdc, confWinTopOffset, confWinBottomOffset);
decodedHeight, chromaFormatIdc, confWinTopOffset, confWinBottomOffset);
} else {
frameWidth = decodedWidth;
frameHeight = decodedHeight;
}
bitDepthLumaMinus8 = data.readUnsignedExpGolombCodedInt();
bitDepthChromaMinus8 = data.readUnsignedExpGolombCodedInt();
@ -1714,6 +1727,8 @@ public final class NalUnitUtil {
seqParameterSetId,
frameWidth,
frameHeight,
decodedWidth,
decodedHeight,
pixelWidthHeightRatio,
maxNumReorderPics,
colorSpace,

View File

@ -436,8 +436,9 @@ public final class MediaCodecInfo {
if (oldFormat.rotationDegrees != newFormat.rotationDegrees) {
discardReasons |= DISCARD_REASON_VIDEO_ROTATION_CHANGED;
}
if (!adaptive
&& (oldFormat.width != newFormat.width || oldFormat.height != newFormat.height)) {
boolean resolutionChanged =
oldFormat.width != newFormat.width || oldFormat.height != newFormat.height;
if (!adaptive && resolutionChanged) {
discardReasons |= DISCARD_REASON_VIDEO_RESOLUTION_CHANGED;
}
if ((!ColorInfo.isEquivalentToAssumedSdrDefault(oldFormat.colorInfo)
@ -451,6 +452,17 @@ public final class MediaCodecInfo {
discardReasons |= DISCARD_REASON_WORKAROUND;
}
if (oldFormat.decodedWidth != Format.NO_VALUE
&& oldFormat.decodedHeight != Format.NO_VALUE
&& oldFormat.decodedWidth == newFormat.decodedWidth
&& oldFormat.decodedHeight == newFormat.decodedHeight
&& resolutionChanged) {
// Work around a bug where MediaCodec fails to adapt between formats if the compressed
// picture dimensions match but the cropped region for display differs.
// See b/409036359.
discardReasons |= DISCARD_REASON_WORKAROUND;
}
if (discardReasons == 0) {
return new DecoderReuseEvaluation(
name,

View File

@ -24,6 +24,7 @@ import static androidx.media3.exoplayer.DecoderReuseEvaluation.DISCARD_REASON_MI
import static androidx.media3.exoplayer.DecoderReuseEvaluation.DISCARD_REASON_VIDEO_COLOR_INFO_CHANGED;
import static androidx.media3.exoplayer.DecoderReuseEvaluation.DISCARD_REASON_VIDEO_RESOLUTION_CHANGED;
import static androidx.media3.exoplayer.DecoderReuseEvaluation.DISCARD_REASON_VIDEO_ROTATION_CHANGED;
import static androidx.media3.exoplayer.DecoderReuseEvaluation.DISCARD_REASON_WORKAROUND;
import static androidx.media3.exoplayer.DecoderReuseEvaluation.REUSE_RESULT_NO;
import static androidx.media3.exoplayer.DecoderReuseEvaluation.REUSE_RESULT_YES_WITH_FLUSH;
import static androidx.media3.exoplayer.DecoderReuseEvaluation.REUSE_RESULT_YES_WITH_RECONFIGURATION;
@ -299,6 +300,24 @@ public final class MediaCodecInfoTest {
DISCARD_REASON_INITIALIZATION_DATA_CHANGED));
}
@Test
public void canReuseCodec_differentVideoCrop_returnsNo() {
MediaCodecInfo codecInfo = buildH264CodecInfo(/* adaptive= */ true);
Format hdCodedAs4K =
FORMAT_H264_HD.buildUpon().setDecodedWidth(3840).setDecodedHeight(2160).build();
Format uhdCodedAs4K =
FORMAT_H264_4K.buildUpon().setDecodedWidth(3840).setDecodedHeight(2160).build();
assertThat(codecInfo.canReuseCodec(hdCodedAs4K, uhdCodedAs4K))
.isEqualTo(
new DecoderReuseEvaluation(
codecInfo.name,
hdCodedAs4K,
uhdCodedAs4K,
REUSE_RESULT_NO,
DISCARD_REASON_WORKAROUND));
}
private static MediaCodecInfo buildH264CodecInfo(boolean adaptive) {
return new MediaCodecInfo(
"h264",

View File

@ -99,6 +99,8 @@ public final class HevcConfig {
int bufferPosition = 0;
int width = Format.NO_VALUE;
int height = Format.NO_VALUE;
int decodedWidth = Format.NO_VALUE;
int decodedHeight = Format.NO_VALUE;
int bitdepthLuma = Format.NO_VALUE;
int bitdepthChroma = Format.NO_VALUE;
@C.ColorSpace int colorSpace = Format.NO_VALUE;
@ -135,6 +137,8 @@ public final class HevcConfig {
maxSubLayers = spsData.maxSubLayersMinus1 + 1;
width = spsData.width;
height = spsData.height;
decodedWidth = spsData.decodedWidth;
decodedHeight = spsData.decodedHeight;
bitdepthLuma = spsData.bitDepthLumaMinus8 + 8;
bitdepthChroma = spsData.bitDepthChromaMinus8 + 8;
colorSpace = spsData.colorSpace;
@ -177,6 +181,8 @@ public final class HevcConfig {
maxSubLayers,
width,
height,
decodedWidth,
decodedHeight,
bitdepthLuma,
bitdepthChroma,
colorSpace,
@ -206,12 +212,18 @@ public final class HevcConfig {
/** The {@code sps_max_sub_layers_minus1 + 1} value: the number of temporal sub-layers. */
public final int maxSubLayers;
/** The width of each decoded frame, or {@link Format#NO_VALUE} if unknown. */
/** The width of each cropped decoded picture, or {@link Format#NO_VALUE} if unknown. */
public final int width;
/** The height of each decoded frame, or {@link Format#NO_VALUE} if unknown. */
/** The height of each cropped decoded picture, or {@link Format#NO_VALUE} if unknown. */
public final int height;
/** The width of each decoded picture, or {@link Format#NO_VALUE} if unknown. */
public final int decodedWidth;
/** The height of each decoded picture, or {@link Format#NO_VALUE} if unknown. */
public final int decodedHeight;
/** The bit depth of the luma samples, or {@link Format#NO_VALUE} if unknown. */
public final int bitdepthLuma;
@ -267,6 +279,8 @@ public final class HevcConfig {
int maxSubLayers,
int width,
int height,
int decodedWidth,
int decodedHeight,
int bitdepthLuma,
int bitdepthChroma,
@C.ColorSpace int colorSpace,
@ -282,6 +296,8 @@ public final class HevcConfig {
this.maxSubLayers = maxSubLayers;
this.width = width;
this.height = height;
this.decodedWidth = decodedWidth;
this.decodedHeight = decodedHeight;
this.bitdepthLuma = bitdepthLuma;
this.bitdepthChroma = bitdepthChroma;
this.colorSpace = colorSpace;

View File

@ -1279,6 +1279,8 @@ public final class BoxParser {
int maxNumReorderSamples = Format.NO_VALUE;
int maxSubLayers = Format.NO_VALUE;
@Nullable NalUnitUtil.H265VpsData vpsData = null;
int decodedWidth = Format.NO_VALUE;
int decodedHeight = Format.NO_VALUE;
// HDR related metadata.
@C.ColorSpace int colorSpace = Format.NO_VALUE;
@ -1331,6 +1333,8 @@ public final class BoxParser {
// HEVCDecoderConfigurationRecord may include 3D reference displays information SEI.
stereoMode = hevcConfig.stereoMode;
}
decodedWidth = hevcConfig.decodedWidth;
decodedHeight = hevcConfig.decodedHeight;
colorSpace = hevcConfig.colorSpace;
colorRange = hevcConfig.colorRange;
colorTransfer = hevcConfig.colorTransfer;
@ -1607,6 +1611,8 @@ public final class BoxParser {
.setCodecs(codecs)
.setWidth(width)
.setHeight(height)
.setDecodedWidth(decodedWidth)
.setDecodedHeight(decodedHeight)
.setPixelWidthHeightRatio(pixelWidthHeightRatio)
.setRotationDegrees(rotationDegrees)
.setProjectionData(projectionData)

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -279,6 +281,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -223,6 +225,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -139,6 +141,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -55,6 +57,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -14,6 +14,8 @@ track 0:
maxNumReorderSamples = 2
width = 416
height = 234
decodedWidth = 416
decodedHeight = 240
maxSubLayers = 1
colorInfo:
colorSpace = 2

View File

@ -14,6 +14,8 @@ track 0:
maxNumReorderSamples = 2
width = 416
height = 234
decodedWidth = 416
decodedHeight = 240
maxSubLayers = 1
colorInfo:
colorSpace = 2

View File

@ -14,6 +14,8 @@ track 0:
maxNumReorderSamples = 2
width = 416
height = 234
decodedWidth = 416
decodedHeight = 240
maxSubLayers = 1
colorInfo:
colorSpace = 2

View File

@ -14,6 +14,8 @@ track 0:
maxNumReorderSamples = 2
width = 416
height = 234
decodedWidth = 416
decodedHeight = 240
maxSubLayers = 1
colorInfo:
colorSpace = 2

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -21,6 +21,8 @@ track 0:
maxNumReorderSamples = 2
width = 854
height = 480
decodedWidth = 856
decodedHeight = 480
frameRate = 30.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -278,6 +280,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -222,6 +224,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -138,6 +140,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -54,6 +56,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -278,6 +280,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -222,6 +224,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -138,6 +140,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -54,6 +56,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -278,6 +280,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1024
height = 768
decodedWidth = 1024
decodedHeight = 768
frameRate = 27.61
rotationDegrees = 90
maxSubLayers = 1
@ -278,6 +280,8 @@ track 1:
maxNumReorderSamples = 0
width = 2048
height = 1536
decodedWidth = 2048
decodedHeight = 1536
frameRate = 2.14
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 28.03
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.70
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1440
decodedWidth = 1920
decodedHeight = 1440
frameRate = 28.81
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1934
height = 2160
decodedWidth = 1936
decodedHeight = 2160
frameRate = 90.00
maxSubLayers = 1
colorInfo:

View File

@ -72,6 +72,8 @@ track 2:
maxNumReorderSamples = 0
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 29.98
maxSubLayers = 1
colorInfo:

View File

@ -59,6 +59,8 @@ track 2:
maxNumReorderSamples = 0
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
maxSubLayers = 1
colorInfo:
colorSpace = 2

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1280
height = 720
decodedWidth = 1280
decodedHeight = 720
frameRate = 29.98
maxSubLayers = 1
colorInfo:

View File

@ -14,6 +14,8 @@ track 0:
maxNumReorderSamples = 0
width = 1280
height = 720
decodedWidth = 1280
decodedHeight = 720
maxSubLayers = 1
colorInfo:
colorSpace = 6

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1280
height = 720
decodedWidth = 1280
decodedHeight = 720
frameRate = 29.97
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1280
height = 720
decodedWidth = 1280
decodedHeight = 720
frameRate = 29.98
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1280
height = 720
decodedWidth = 1280
decodedHeight = 720
frameRate = 29.98
maxSubLayers = 1
colorInfo:

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.11
maxSubLayers = 1
colorInfo:
@ -387,6 +389,8 @@ track 1:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 27.11
maxSubLayers = 1
colorInfo:

View File

@ -14,6 +14,8 @@ track 0:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
maxSubLayers = 1
colorInfo:
colorSpace = 6
@ -376,6 +378,8 @@ track 1:
maxNumReorderSamples = 2
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
maxSubLayers = 1
colorInfo:
colorSpace = 6

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 2
width = 1280
height = 720
decodedWidth = 1280
decodedHeight = 720
frameRate = 30.00
rotationDegrees = 90
maxSubLayers = 1

View File

@ -20,6 +20,8 @@ track 0:
maxNumReorderSamples = 0
width = 1920
height = 1080
decodedWidth = 1920
decodedHeight = 1088
frameRate = 29.98
rotationDegrees = 90
maxSubLayers = 1

View File

@ -56,6 +56,8 @@ public final class DumpableFormat implements Dumper.Dumpable {
"maxNumReorderSamples", format, DEFAULT_FORMAT, format -> format.maxNumReorderSamples);
dumper.addIfNonDefault("width", format, DEFAULT_FORMAT, format -> format.width);
dumper.addIfNonDefault("height", format, DEFAULT_FORMAT, format -> format.height);
dumper.addIfNonDefault("decodedWidth", format, DEFAULT_FORMAT, format -> format.decodedWidth);
dumper.addIfNonDefault("decodedHeight", format, DEFAULT_FORMAT, format -> format.decodedHeight);
dumper.addIfNonDefault(
"frameRate",
format,