From f8d98861ea292c4bf7c18831facc2a7ce98ee633 Mon Sep 17 00:00:00 2001 From: Daniele Sparano Date: Thu, 27 Jul 2023 14:51:47 +0100 Subject: [PATCH] Move luma and chroma bitdepths to ColorInfo class --- .../androidx/media3/common/ColorInfo.java | 92 ++++++++++++++++--- .../java/androidx/media3/common/Format.java | 75 ++------------- .../androidx/media3/common/FormatTest.java | 6 +- .../exoplayer/util/DebugTextViewHelper.java | 8 +- .../media3/exoplayer/rtsp/RtspMediaTrack.java | 25 +++-- .../extractor/mkv/MatroskaExtractor.java | 5 +- .../media3/extractor/mp4/AtomParsers.java | 27 +++--- .../media3/extractor/ts/H264Reader.java | 11 ++- .../media3/extractor/ts/H265Reader.java | 11 ++- 9 files changed, 144 insertions(+), 116 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/ColorInfo.java b/libraries/common/src/main/java/androidx/media3/common/ColorInfo.java index 5d715c3989..87853a2132 100644 --- a/libraries/common/src/main/java/androidx/media3/common/ColorInfo.java +++ b/libraries/common/src/main/java/androidx/media3/common/ColorInfo.java @@ -43,12 +43,16 @@ public final class ColorInfo implements Bundleable { private @C.ColorRange int colorRange; private @C.ColorTransfer int colorTransfer; @Nullable private byte[] hdrStaticInfo; + private int lumaBitdepth; + private int chromaBitdepth; /** Creates a new instance with default values. */ public Builder() { colorSpace = Format.NO_VALUE; colorRange = Format.NO_VALUE; colorTransfer = Format.NO_VALUE; + lumaBitdepth = Format.NO_VALUE; + chromaBitdepth = Format.NO_VALUE; } /** Creates a new instance to build upon the provided {@link ColorInfo}. */ @@ -57,6 +61,8 @@ public final class ColorInfo implements Bundleable { this.colorRange = colorInfo.colorRange; this.colorTransfer = colorInfo.colorTransfer; this.hdrStaticInfo = colorInfo.hdrStaticInfo; + this.lumaBitdepth = colorInfo.lumaBitdepth; + this.chromaBitdepth = colorInfo.chromaBitdepth; } /** @@ -116,19 +122,43 @@ public final class ColorInfo implements Bundleable { return this; } + /** + * Sets the luma bit depth. + * + * @param lumaBitdepth The lumaBitdepth. The default value is {@link Format#NO_VALUE}. + * @return The builder. + */ + @CanIgnoreReturnValue + public Builder setLumaBitdepth(int lumaBitdepth) { + this.lumaBitdepth = lumaBitdepth; + return this; + } + + /** + * Sets chroma bit depth. + * + * @param chromaBitdepth The chromaBitdepth. The default value is {@link Format#NO_VALUE}. + * @return The builder. + */ + @CanIgnoreReturnValue + public Builder setChromaBitdepth(int chromaBitdepth) { + this.chromaBitdepth = chromaBitdepth; + return this; + } + /** Builds a new {@link ColorInfo} instance. */ public ColorInfo build() { - return new ColorInfo(colorSpace, colorRange, colorTransfer, hdrStaticInfo); + return new ColorInfo(colorSpace, colorRange, colorTransfer, hdrStaticInfo, lumaBitdepth, chromaBitdepth); } } /** Color info representing SDR BT.709 limited range, which is a common SDR video color format. */ public static final ColorInfo SDR_BT709_LIMITED = - new ColorInfo( - C.COLOR_SPACE_BT709, - C.COLOR_RANGE_LIMITED, - C.COLOR_TRANSFER_SDR, - /* hdrStaticInfo= */ null); + new ColorInfo.Builder() + .setColorSpace(C.COLOR_SPACE_BT709) + .setColorRange(C.COLOR_RANGE_LIMITED) + .setColorTransfer(C.COLOR_TRANSFER_SDR) + .build(); /** * Color info representing SDR sRGB in accordance with {@link @@ -213,6 +243,11 @@ public final class ColorInfo implements Bundleable { /** HdrStaticInfo as defined in CTA-861.3, or null if none specified. */ @Nullable public final byte[] hdrStaticInfo; + /** The bit depth of the luma samples of the video. */ + public final int lumaBitdepth; + /** The bit depth of the chroma samples of the video. It may differ from the luma bit depth. */ + public final int chromaBitdepth; + // Lazily initialized hashcode. private int hashCode; @@ -223,6 +258,8 @@ public final class ColorInfo implements Bundleable { * @param colorRange The color range of the video. * @param colorTransfer The color transfer characteristics of the video. * @param hdrStaticInfo HdrStaticInfo as defined in CTA-861.3, or null if none specified. + * @param lumaBitdepth The bit depth of the luma samples of the video. + * @param chromaBitdepth The bit depth of the chroma samples of the video. * @deprecated Use {@link Builder}. */ @Deprecated @@ -230,11 +267,15 @@ public final class ColorInfo implements Bundleable { @C.ColorSpace int colorSpace, @C.ColorRange int colorRange, @C.ColorTransfer int colorTransfer, - @Nullable byte[] hdrStaticInfo) { + @Nullable byte[] hdrStaticInfo, + int lumaBitdepth, + int chromaBitdepth) { this.colorSpace = colorSpace; this.colorRange = colorRange; this.colorTransfer = colorTransfer; this.hdrStaticInfo = hdrStaticInfo; + this.lumaBitdepth = lumaBitdepth; + this.chromaBitdepth = chromaBitdepth; } /** Returns a {@link Builder} initialized with the values of this instance. */ @@ -245,7 +286,8 @@ public final class ColorInfo implements Bundleable { /** * Returns whether this instance is valid. * - *

This instance is valid if no members are {@link Format#NO_VALUE}. + *

This instance is valid if no color members are {@link Format#NO_VALUE}, + * while bit depths may be unset. */ public boolean isValid() { return colorSpace != Format.NO_VALUE @@ -258,7 +300,7 @@ public final class ColorInfo implements Bundleable { * * @see Format#toLogString(Format) */ - public String toLogString() { + public String toColorString() { if (!isValid()) { return "NA"; } @@ -270,6 +312,20 @@ public final class ColorInfo implements Bundleable { colorTransferToString(colorTransfer)); } + /** + * Returns whether this instance has valid bitdepths. + * + *

This instance has valid bitdepths if none of them is {@link Format#NO_VALUE}. + */ + public boolean isBppValid() { + return lumaBitdepth != Format.NO_VALUE + && chromaBitdepth != Format.NO_VALUE; + } + + public String toBppString() { + return isBppValid() ? lumaBitdepth + "," + chromaBitdepth : "NA"; + } + @Override public boolean equals(@Nullable Object obj) { if (this == obj) { @@ -282,12 +338,18 @@ public final class ColorInfo implements Bundleable { return colorSpace == other.colorSpace && colorRange == other.colorRange && colorTransfer == other.colorTransfer - && Arrays.equals(hdrStaticInfo, other.hdrStaticInfo); + && Arrays.equals(hdrStaticInfo, other.hdrStaticInfo) + && lumaBitdepth == other.lumaBitdepth + && chromaBitdepth == other.chromaBitdepth; } @Override public String toString() { return "ColorInfo(" + + lumaBitdepth + + ", " + + chromaBitdepth + + ", " + colorSpaceToString(colorSpace) + ", " + colorRangeToString(colorRange) @@ -358,6 +420,8 @@ public final class ColorInfo implements Bundleable { result = 31 * result + colorRange; result = 31 * result + colorTransfer; result = 31 * result + Arrays.hashCode(hdrStaticInfo); + result = 31 * result + lumaBitdepth; + result = 31 * result + chromaBitdepth; hashCode = result; } return hashCode; @@ -369,6 +433,8 @@ public final class ColorInfo implements Bundleable { private static final String FIELD_COLOR_RANGE = Util.intToStringMaxRadix(1); private static final String FIELD_COLOR_TRANSFER = Util.intToStringMaxRadix(2); private static final String FIELD_HDR_STATIC_INFO = Util.intToStringMaxRadix(3); + private static final String FIELD_LUMA_BITDEPTH = Util.intToStringMaxRadix(4); + private static final String FIELD_CHROMA_BITDEPTH = Util.intToStringMaxRadix(5); @Override public Bundle toBundle() { @@ -377,6 +443,8 @@ public final class ColorInfo implements Bundleable { bundle.putInt(FIELD_COLOR_RANGE, colorRange); bundle.putInt(FIELD_COLOR_TRANSFER, colorTransfer); bundle.putByteArray(FIELD_HDR_STATIC_INFO, hdrStaticInfo); + bundle.putInt(FIELD_LUMA_BITDEPTH, lumaBitdepth); + bundle.putInt(FIELD_CHROMA_BITDEPTH, chromaBitdepth); return bundle; } @@ -386,5 +454,7 @@ public final class ColorInfo implements Bundleable { bundle.getInt(FIELD_COLOR_SPACE, Format.NO_VALUE), bundle.getInt(FIELD_COLOR_RANGE, Format.NO_VALUE), bundle.getInt(FIELD_COLOR_TRANSFER, Format.NO_VALUE), - bundle.getByteArray(FIELD_HDR_STATIC_INFO)); + bundle.getByteArray(FIELD_HDR_STATIC_INFO), + bundle.getInt(FIELD_LUMA_BITDEPTH, Format.NO_VALUE), + bundle.getInt(FIELD_CHROMA_BITDEPTH, Format.NO_VALUE)); } diff --git a/libraries/common/src/main/java/androidx/media3/common/Format.java b/libraries/common/src/main/java/androidx/media3/common/Format.java index 8761834d25..bb7530d46a 100644 --- a/libraries/common/src/main/java/androidx/media3/common/Format.java +++ b/libraries/common/src/main/java/androidx/media3/common/Format.java @@ -96,8 +96,6 @@ import java.util.UUID; *

  • {@link #projectionData} *
  • {@link #stereoMode} *
  • {@link #colorInfo} - *
  • {@link #lumaBitdepth} - *
  • {@link #chromaBitdepth} * * *

    Fields relevant to audio formats

    @@ -169,8 +167,6 @@ public final class Format implements Bundleable { @Nullable private byte[] projectionData; private @C.StereoMode int stereoMode; @Nullable private ColorInfo colorInfo; - private int lumaBitdepth; - private int chromaBitdepth; // Audio specific. @@ -207,8 +203,6 @@ public final class Format implements Bundleable { frameRate = NO_VALUE; pixelWidthHeightRatio = 1.0f; stereoMode = NO_VALUE; - lumaBitdepth = 8; - chromaBitdepth = 8; // Audio specific. channelCount = NO_VALUE; sampleRate = NO_VALUE; @@ -255,8 +249,6 @@ public final class Format implements Bundleable { this.projectionData = format.projectionData; this.stereoMode = format.stereoMode; this.colorInfo = format.colorInfo; - this.lumaBitdepth = format.lumaBitdepth; - this.chromaBitdepth = format.chromaBitdepth; // Audio specific. this.channelCount = format.channelCount; this.sampleRate = format.sampleRate; @@ -568,30 +560,6 @@ public final class Format implements Bundleable { return this; } - /** - * Sets {@link Format#lumaBitdepth}. The default value is 8. - * - * @param lumaBitdepth The {@link Format#lumaBitdepth}. - * @return The builder. - */ - @CanIgnoreReturnValue - public Builder setLumaBitdepth(int lumaBitdepth) { - this.lumaBitdepth = lumaBitdepth; - return this; - } - - /** - * Sets {@link Format#chromaBitdepth}. The default value is 8. - * - * @param chromaBitdepth The {@link Format#chromaBitdepth}. - * @return The builder. - */ - @CanIgnoreReturnValue - public Builder setChromaBitdepth(int chromaBitdepth) { - this.chromaBitdepth = chromaBitdepth; - return this; - } - // Audio specific. /** @@ -904,10 +872,6 @@ public final class Format implements Bundleable { /** The color metadata associated with the video, or null if not applicable. */ @UnstableApi @Nullable public final ColorInfo colorInfo; - /** The bit depth of the luma samples of the video. */ - public final int lumaBitdepth; - /** The bit depth of the chroma samples of the video. It might differ from the luma bit depth. */ - public final int chromaBitdepth; // Audio specific. @@ -995,8 +959,6 @@ public final class Format implements Bundleable { projectionData = builder.projectionData; stereoMode = builder.stereoMode; colorInfo = builder.colorInfo; - lumaBitdepth = builder.lumaBitdepth; - chromaBitdepth = builder.chromaBitdepth; // Audio specific. channelCount = builder.channelCount; sampleRate = builder.sampleRate; @@ -1130,10 +1092,6 @@ public final class Format implements Bundleable { + ", " + frameRate + ", " - + lumaBitdepth - + ", " - + chromaBitdepth - + ", " + colorInfo + "]" + ", [" @@ -1174,8 +1132,6 @@ public final class Format implements Bundleable { // [Omitted] projectionData. result = 31 * result + stereoMode; // [Omitted] colorInfo. - result = 31 * result + lumaBitdepth; - result = 31 * result + chromaBitdepth; // Audio specific. result = 31 * result + channelCount; result = 31 * result + sampleRate; @@ -1217,8 +1173,6 @@ public final class Format implements Bundleable { && height == other.height && rotationDegrees == other.rotationDegrees && stereoMode == other.stereoMode - && lumaBitdepth == other.lumaBitdepth - && chromaBitdepth == other.chromaBitdepth && channelCount == other.channelCount && sampleRate == other.sampleRate && pcmEncoding == other.pcmEncoding @@ -1305,11 +1259,8 @@ public final class Format implements Bundleable { if (format.width != NO_VALUE && format.height != NO_VALUE) { builder.append(", res=").append(format.width).append("x").append(format.height); } - if (format.lumaBitdepth != NO_VALUE && format.chromaBitdepth != NO_VALUE) { - builder.append(", bitdepth=[").append(format.lumaBitdepth).append(",").append(format.chromaBitdepth).append(']'); - } if (format.colorInfo != null && format.colorInfo.isValid()) { - builder.append(", color=").append(format.colorInfo.toLogString()); + builder.append(", color=").append(format.colorInfo.toColorString()); } if (format.frameRate != NO_VALUE) { builder.append(", fps=").append(format.frameRate); @@ -1422,17 +1373,15 @@ public final class Format implements Bundleable { private static final String FIELD_PROJECTION_DATA = Util.intToStringMaxRadix(20); private static final String FIELD_STEREO_MODE = Util.intToStringMaxRadix(21); private static final String FIELD_COLOR_INFO = Util.intToStringMaxRadix(22); - private static final String FIELD_LUMA_BITDEPTH = Util.intToStringMaxRadix(23); - private static final String FIELD_CHROMA_BITDEPTH = Util.intToStringMaxRadix(24); - private static final String FIELD_CHANNEL_COUNT = Util.intToStringMaxRadix(25); - private static final String FIELD_SAMPLE_RATE = Util.intToStringMaxRadix(26); - private static final String FIELD_PCM_ENCODING = Util.intToStringMaxRadix(27); - private static final String FIELD_ENCODER_DELAY = Util.intToStringMaxRadix(28); - private static final String FIELD_ENCODER_PADDING = Util.intToStringMaxRadix(29); - private static final String FIELD_ACCESSIBILITY_CHANNEL = Util.intToStringMaxRadix(30); - private static final String FIELD_CRYPTO_TYPE = Util.intToStringMaxRadix(31); - private static final String FIELD_TILE_COUNT_HORIZONTAL = Util.intToStringMaxRadix(32); - private static final String FIELD_TILE_COUNT_VERTICAL = Util.intToStringMaxRadix(33); + private static final String FIELD_CHANNEL_COUNT = Util.intToStringMaxRadix(23); + private static final String FIELD_SAMPLE_RATE = Util.intToStringMaxRadix(24); + private static final String FIELD_PCM_ENCODING = Util.intToStringMaxRadix(25); + private static final String FIELD_ENCODER_DELAY = Util.intToStringMaxRadix(26); + private static final String FIELD_ENCODER_PADDING = Util.intToStringMaxRadix(27); + private static final String FIELD_ACCESSIBILITY_CHANNEL = Util.intToStringMaxRadix(28); + private static final String FIELD_CRYPTO_TYPE = Util.intToStringMaxRadix(29); + private static final String FIELD_TILE_COUNT_HORIZONTAL = Util.intToStringMaxRadix(30); + private static final String FIELD_TILE_COUNT_VERTICAL = Util.intToStringMaxRadix(31); @UnstableApi @Override @@ -1482,8 +1431,6 @@ public final class Format implements Bundleable { if (colorInfo != null) { bundle.putBundle(FIELD_COLOR_INFO, colorInfo.toBundle()); } - bundle.putInt(FIELD_LUMA_BITDEPTH, lumaBitdepth); - bundle.putInt(FIELD_CHROMA_BITDEPTH, chromaBitdepth); // Audio specific. bundle.putInt(FIELD_CHANNEL_COUNT, channelCount); bundle.putInt(FIELD_SAMPLE_RATE, sampleRate); @@ -1549,8 +1496,6 @@ public final class Format implements Bundleable { if (colorInfoBundle != null) { builder.setColorInfo(ColorInfo.CREATOR.fromBundle(colorInfoBundle)); } - builder.setLumaBitdepth(bundle.getInt(FIELD_LUMA_BITDEPTH, DEFAULT.lumaBitdepth)); - builder.setChromaBitdepth(bundle.getInt(FIELD_CHROMA_BITDEPTH, DEFAULT.chromaBitdepth)); // Audio specific. builder .setChannelCount(bundle.getInt(FIELD_CHANNEL_COUNT, DEFAULT.channelCount)) diff --git a/libraries/common/src/test/java/androidx/media3/common/FormatTest.java b/libraries/common/src/test/java/androidx/media3/common/FormatTest.java index 785be56820..b3429a63f0 100644 --- a/libraries/common/src/test/java/androidx/media3/common/FormatTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/FormatTest.java @@ -78,7 +78,9 @@ public final class FormatTest { C.COLOR_SPACE_BT709, C.COLOR_RANGE_LIMITED, C.COLOR_TRANSFER_SDR, - new byte[] {1, 2, 3, 4, 5, 6, 7}); + new byte[] {1, 2, 3, 4, 5, 6, 7}, + /* lumaBitdepth */ 9, + /* chromaBitdepth */ 11); return new Format.Builder() .setId("id") @@ -104,8 +106,6 @@ public final class FormatTest { .setProjectionData(projectionData) .setStereoMode(C.STEREO_MODE_TOP_BOTTOM) .setColorInfo(colorInfo) - .setLumaBitdepth(9) - .setChromaBitdepth(11) .setChannelCount(6) .setSampleRate(44100) .setPcmEncoding(C.ENCODING_PCM_24BIT) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/DebugTextViewHelper.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/DebugTextViewHelper.java index c9733d03da..bd73dcbb96 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/DebugTextViewHelper.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/util/DebugTextViewHelper.java @@ -139,7 +139,6 @@ public class DebugTextViewHelper { + format.width + "x" + format.height - + getBitdepthInfoString(format.lumaBitdepth) + getColorInfoString(format.colorInfo) + getPixelAspectRatioString(format.pixelWidthHeightRatio) + getDecoderCountersBufferCountString(decoderCounters) @@ -189,12 +188,9 @@ public class DebugTextViewHelper { + counters.droppedToKeyframeCount; } - private static String getBitdepthInfoString(int lumaBitdepth) { - return lumaBitdepth != Format.NO_VALUE ? " b:" + lumaBitdepth : ""; - } - private static String getColorInfoString(@Nullable ColorInfo colorInfo) { - return colorInfo != null && colorInfo.isValid() ? " colr:" + colorInfo.toLogString() : ""; + return colorInfo != null ? (colorInfo.isBppValid() ? " b:" + colorInfo.toBppString() : "") + + (colorInfo.isValid() ? " colr:" + colorInfo.toColorString() : "") : ""; } private static String getPixelAspectRatioString(float pixelAspectRatio) { diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java index a8fbd5809a..11c7e6e609 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java @@ -32,6 +32,7 @@ import android.util.Pair; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.media3.common.C; +import androidx.media3.common.ColorInfo; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.ParserException; @@ -421,10 +422,14 @@ import com.google.common.collect.ImmutableMap; formatBuilder.setPixelWidthHeightRatio(spsData.pixelWidthHeightRatio); formatBuilder.setHeight(spsData.height); formatBuilder.setWidth(spsData.width); - int bitdepthLuma = spsData.bitDepthLumaMinus8 + 8; - formatBuilder.setLumaBitdepth(bitdepthLuma); - int bitdepthChroma = spsData.bitDepthChromaMinus8 + 8; - formatBuilder.setChromaBitdepth(bitdepthChroma); + formatBuilder.setColorInfo( + new ColorInfo( + spsData.colorSpace, + spsData.colorRange, + spsData.colorTransfer, + null, + spsData.bitDepthLumaMinus8 + 8, + spsData.bitDepthChromaMinus8 + 8)); @Nullable String profileLevel = fmtpAttributes.get(PARAMETER_PROFILE_LEVEL_ID); if (profileLevel != null) { @@ -468,10 +473,14 @@ import com.google.common.collect.ImmutableMap; spsNalDataWithStartCode, NAL_START_CODE.length, spsNalDataWithStartCode.length); formatBuilder.setPixelWidthHeightRatio(spsData.pixelWidthHeightRatio); formatBuilder.setHeight(spsData.height).setWidth(spsData.width); - int bitdepthLuma = spsData.bitDepthLumaMinus8 + 8; - formatBuilder.setLumaBitdepth(bitdepthLuma); - int bitdepthChroma = spsData.bitDepthChromaMinus8 + 8; - formatBuilder.setChromaBitdepth(bitdepthChroma); + formatBuilder.setColorInfo( + new ColorInfo( + spsData.colorSpace, + spsData.colorRange, + spsData.colorTransfer, + null, + spsData.bitDepthLumaMinus8 + 8, + spsData.bitDepthChromaMinus8 + 8)); formatBuilder.setCodecs( CodecSpecificDataUtil.buildHevcCodecString( diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java index fe207d2243..e558db01d8 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mkv/MatroskaExtractor.java @@ -1021,6 +1021,7 @@ public class MatroskaExtractor implements Extractor { break; case ID_COLOUR_BITS_PER_CHANNEL: assertInTrackEntry(id); + currentTrack.hasColorInfo = true; currentTrack.bitsPerChannel = (int)value; break; case ID_COLOUR_RANGE: @@ -2307,7 +2308,7 @@ public class MatroskaExtractor implements Extractor { @Nullable ColorInfo colorInfo = null; if (hasColorInfo) { @Nullable byte[] hdrStaticInfo = getHdrStaticInfo(); - colorInfo = new ColorInfo(colorSpace, colorRange, colorTransfer, hdrStaticInfo); + colorInfo = new ColorInfo(colorSpace, colorRange, colorTransfer, hdrStaticInfo, bitsPerChannel, bitsPerChannel); } int rotationDegrees = Format.NO_VALUE; @@ -2332,8 +2333,6 @@ public class MatroskaExtractor implements Extractor { formatBuilder .setWidth(width) .setHeight(height) - .setLumaBitdepth(bitsPerChannel) - .setChromaBitdepth(bitsPerChannel) .setPixelWidthHeightRatio(pixelWidthHeightRatio) .setRotationDegrees(rotationDegrees) .setProjectionData(projectionData) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java index 3db5c9700b..680e647014 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java @@ -1358,27 +1358,22 @@ import java.util.List; .setCodecs(codecs) .setWidth(width) .setHeight(height) - .setLumaBitdepth(bitdepthLuma) - .setChromaBitdepth(bitdepthChroma) .setPixelWidthHeightRatio(pixelWidthHeightRatio) .setRotationDegrees(rotationDegrees) .setProjectionData(projectionData) .setStereoMode(stereoMode) .setInitializationData(initializationData) - .setDrmInitData(drmInitData); - if (colorSpace != Format.NO_VALUE - || colorRange != Format.NO_VALUE - || colorTransfer != Format.NO_VALUE - || hdrStaticInfo != null) { - // Note that if either mdcv or clli are missing, we leave the corresponding HDR static - // metadata bytes with value zero. See [Internal ref: b/194535665]. - formatBuilder.setColorInfo( - new ColorInfo( - colorSpace, - colorRange, - colorTransfer, - hdrStaticInfo != null ? hdrStaticInfo.array() : null)); - } + .setDrmInitData(drmInitData) + // Note that if either mdcv or clli are missing, we leave the corresponding HDR static + // metadata bytes with value zero. See [Internal ref: b/194535665]. + .setColorInfo( + new ColorInfo( + colorSpace, + colorRange, + colorTransfer, + hdrStaticInfo != null ? hdrStaticInfo.array() : null, + bitdepthLuma, + bitdepthChroma)); if (esdsData != null) { formatBuilder diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java index 9c90117b1d..c6ff3ba182 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H264Reader.java @@ -20,6 +20,7 @@ import static androidx.media3.extractor.ts.TsPayloadReader.FLAG_RANDOM_ACCESS_IN import android.util.SparseArray; import androidx.annotation.Nullable; import androidx.media3.common.C; +import androidx.media3.common.ColorInfo; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.util.Assertions; @@ -219,8 +220,14 @@ public final class H264Reader implements ElementaryStreamReader { .setCodecs(codecs) .setWidth(spsData.width) .setHeight(spsData.height) - .setLumaBitdepth(spsData.bitDepthLumaMinus8 + 8) - .setChromaBitdepth(spsData.bitDepthChromaMinus8 + 8) + .setColorInfo( + new ColorInfo( + spsData.colorSpace, + spsData.colorRange, + spsData.colorTransfer, + null, + spsData.bitDepthLumaMinus8 + 8, + spsData.bitDepthChromaMinus8 + 8)) .setPixelWidthHeightRatio(spsData.pixelWidthHeightRatio) .setInitializationData(initializationData) .build()); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java index 930151a5a9..e7dea5a55b 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java @@ -17,6 +17,7 @@ package androidx.media3.extractor.ts; import androidx.annotation.Nullable; import androidx.media3.common.C; +import androidx.media3.common.ColorInfo; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.util.Assertions; @@ -264,8 +265,14 @@ public final class H265Reader implements ElementaryStreamReader { .setCodecs(codecs) .setWidth(spsData.width) .setHeight(spsData.height) - .setLumaBitdepth(spsData.bitDepthLumaMinus8 + 8) - .setChromaBitdepth(spsData.bitDepthChromaMinus8 + 8) + .setColorInfo( + new ColorInfo( + spsData.colorSpace, + spsData.colorRange, + spsData.colorTransfer, + null, + spsData.bitDepthLumaMinus8 + 8, + spsData.bitDepthChromaMinus8 + 8)) .setPixelWidthHeightRatio(spsData.pixelWidthHeightRatio) .setInitializationData(Collections.singletonList(csdData)) .build();