mirror of
https://github.com/androidx/media.git
synced 2025-04-29 14:26:50 +08:00
Dolby-Vision: Add dolby-vision codec support in Mp4Muxer
Add dolby vision with hevc and avc codec in Mp4Muxer according to Dolby ISO media format standard. As initialization data is required for creation of dovi box, CSD is populated in BoxParser. PiperOrigin-RevId: 749765993
This commit is contained in:
parent
d0833c4e7c
commit
dc9d023e85
@ -137,6 +137,40 @@ public final class CodecSpecificDataUtil {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns initialization data for Dolby Vision according to <a
|
||||
* href="https://dolby.my.salesforce.com/sfc/p/#700000009YuG/a/4u000000l6FB/076wHYEmyEfz09m0V1bo85_25hlUJjaiWTbzorNmYY4">Dolby
|
||||
* Vision ISO MediaFormat (section 2.2) specification</a>.
|
||||
*
|
||||
* @param profile The Dolby Vision codec profile.
|
||||
* @param level The Dolby Vision codec level.
|
||||
*/
|
||||
public static byte[] buildDolbyVisionInitializationData(int profile, int level) {
|
||||
byte[] dolbyVisionCsd = new byte[24];
|
||||
byte blCompatibilityId = 0x00;
|
||||
// MD compression is not permitted for profile 7 and earlier. Only some devices
|
||||
// support it from profile 8
|
||||
byte mdCompression = 0x00;
|
||||
if (profile == 8) {
|
||||
blCompatibilityId = 0x04;
|
||||
} else if (profile == 9) {
|
||||
blCompatibilityId = 0x02;
|
||||
mdCompression = 0x01;
|
||||
}
|
||||
|
||||
dolbyVisionCsd[0] = 0x01; // dv_version_major
|
||||
dolbyVisionCsd[1] = 0x00; // dv_version_minor
|
||||
dolbyVisionCsd[2] = (byte) ((profile & 0x7f) << 1); // dv_profile
|
||||
dolbyVisionCsd[2] = (byte) ((dolbyVisionCsd[2] | ((level >> 5) & 0x1)) & 0xff);
|
||||
dolbyVisionCsd[3] = (byte) ((level & 0x1f) << 3); // dv_level
|
||||
dolbyVisionCsd[3] = (byte) (dolbyVisionCsd[3] | (1 << 2)); // rpu_present_flag
|
||||
dolbyVisionCsd[3] = (byte) (dolbyVisionCsd[3] | (0 << 1)); // el_present_flag
|
||||
dolbyVisionCsd[3] = (byte) (dolbyVisionCsd[3] | 1); // bl_present_flag
|
||||
dolbyVisionCsd[4] = (byte) (blCompatibilityId << 4); // dv_bl_signal_compatibility_id
|
||||
dolbyVisionCsd[4] = (byte) (dolbyVisionCsd[4] | (mdCompression << 2)); // dv_md_compression
|
||||
return dolbyVisionCsd;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses an MPEG-4 Visual configuration information, as defined in ISO/IEC14496-2.
|
||||
*
|
||||
@ -266,6 +300,23 @@ public final class CodecSpecificDataUtil {
|
||||
return Util.formatInvariant("s263.%d.%d", profile, level);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a Dolby Vision codec string using profile and level.
|
||||
*
|
||||
* <p>Reference: <a>
|
||||
* href="https://professionalsupport.dolby.com/s/article/What-is-Dolby-Vision-Profile?language=en_US">
|
||||
* Dolby Vision Profile and Level (section 2.3)</a>
|
||||
*/
|
||||
public static String buildDolbyVisionCodecString(int profile, int level) {
|
||||
if (profile > 9) {
|
||||
return Util.formatInvariant("dvh1.%02d.%02d", profile, level);
|
||||
} else if (profile > 8) {
|
||||
return Util.formatInvariant("dvav.%02d.%02d", profile, level);
|
||||
} else {
|
||||
return Util.formatInvariant("dvhe.%02d.%02d", profile, level);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns profile and level (as defined by {@link MediaCodecInfo.CodecProfileLevel})
|
||||
* corresponding to the codec description string (as defined by RFC 6381) of the given format.
|
||||
@ -407,6 +458,83 @@ public final class CodecSpecificDataUtil {
|
||||
return split;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Dolby Vision level number corresponding to the level constant.
|
||||
*
|
||||
* @param levelConstant The Dolby Vision level constant.
|
||||
* @return The Dolby Vision level number.
|
||||
* @throws IllegalArgumentException if the level constant is not recognized.
|
||||
*/
|
||||
public static int dolbyVisionConstantToLevelNumber(int levelConstant) {
|
||||
switch (levelConstant) {
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelHd24:
|
||||
return 1;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelHd30:
|
||||
return 2;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd24:
|
||||
return 3;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd30:
|
||||
return 4;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelFhd60:
|
||||
return 5;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelUhd24:
|
||||
return 6;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelUhd30:
|
||||
return 7;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelUhd48:
|
||||
return 8;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelUhd60:
|
||||
return 9;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevelUhd120:
|
||||
return 10;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevel8k30:
|
||||
return 11;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionLevel8k60:
|
||||
return 12;
|
||||
// TODO: b/179261323 - use framework constant for level 13.
|
||||
case 0x1000:
|
||||
return 13;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown Dolby Vision level: " + levelConstant);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns Dolby Vision profile number corresponding to the profile constant.
|
||||
*
|
||||
* @param profileConstant The Dolby Vision profile constant.
|
||||
* @return The Dolby Vision profile number.
|
||||
* @throws IllegalArgumentException if the profile constant is not recognized.
|
||||
*/
|
||||
public static int dolbyVisionConstantToProfileNumber(int profileConstant) {
|
||||
switch (profileConstant) {
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvavPer:
|
||||
return 0;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvavPen:
|
||||
return 1;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheDer:
|
||||
return 2;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheDen:
|
||||
return 3;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheDtr:
|
||||
return 4;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheStn:
|
||||
return 5;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheDth:
|
||||
return 6;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheDtb:
|
||||
return 7;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvheSt:
|
||||
return 8;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvavSe:
|
||||
return 9;
|
||||
case MediaCodecInfo.CodecProfileLevel.DolbyVisionProfileDvav110:
|
||||
return 10;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown Dolby Vision profile: " + profileConstant);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the next occurrence of the NAL start code from a given index.
|
||||
*
|
||||
|
@ -337,8 +337,9 @@ public final class MediaFormatUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@code Codecs string} of {@link MediaFormat}. In case of an H263 codec string, builds
|
||||
* and returns an RFC 6381 H263 codec string using profile and level.
|
||||
* Returns a {@code Codecs string} of {@link MediaFormat}.
|
||||
*
|
||||
* <p>For H263 and Dolby Vision formats, builds a codec string using profile and level.
|
||||
*/
|
||||
@Nullable
|
||||
@SuppressLint("InlinedApi") // Inlined MediaFormat keys.
|
||||
@ -350,6 +351,16 @@ public final class MediaFormatUtil {
|
||||
return CodecSpecificDataUtil.buildH263CodecString(
|
||||
mediaFormat.getInteger(MediaFormat.KEY_PROFILE),
|
||||
mediaFormat.getInteger(MediaFormat.KEY_LEVEL));
|
||||
} else if (Objects.equals(
|
||||
mediaFormat.getString(MediaFormat.KEY_MIME), MimeTypes.VIDEO_DOLBY_VISION)
|
||||
&& mediaFormat.containsKey(MediaFormat.KEY_PROFILE)
|
||||
&& mediaFormat.containsKey(MediaFormat.KEY_LEVEL)) {
|
||||
// Add Dolby Vision profile and level to codec string as per Dolby Vision ISO media format.
|
||||
return CodecSpecificDataUtil.buildDolbyVisionCodecString(
|
||||
CodecSpecificDataUtil.dolbyVisionConstantToProfileNumber(
|
||||
mediaFormat.getInteger(MediaFormat.KEY_PROFILE)),
|
||||
CodecSpecificDataUtil.dolbyVisionConstantToLevelNumber(
|
||||
mediaFormat.getInteger(MediaFormat.KEY_LEVEL)));
|
||||
} else {
|
||||
return getString(mediaFormat, MediaFormat.KEY_CODECS_STRING, /* defaultValue= */ null);
|
||||
}
|
||||
|
@ -15,8 +15,11 @@
|
||||
*/
|
||||
package androidx.media3.muxer;
|
||||
|
||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||
import static androidx.media3.common.util.Assertions.checkState;
|
||||
import static androidx.media3.muxer.Boxes.getDolbyVisionProfileAndLevel;
|
||||
|
||||
import androidx.media3.common.Format;
|
||||
import androidx.media3.common.MimeTypes;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import java.nio.ByteBuffer;
|
||||
@ -105,7 +108,16 @@ import java.nio.ByteOrder;
|
||||
* Returns whether the sample of the given MIME type will contain NAL units in Annex-B format
|
||||
* (ISO/IEC 14496-10 Annex B, which uses start codes to delineate NAL units).
|
||||
*/
|
||||
public static boolean doesSampleContainAnnexBNalUnits(String sampleMimeType) {
|
||||
public static boolean doesSampleContainAnnexBNalUnits(Format format) {
|
||||
String sampleMimeType = format.sampleMimeType;
|
||||
checkNotNull(sampleMimeType);
|
||||
if (sampleMimeType.equals(MimeTypes.VIDEO_DOLBY_VISION)) {
|
||||
// Dolby vision with AV1 profile does not contain Nal units.
|
||||
int profile = checkNotNull(getDolbyVisionProfileAndLevel(format)).first;
|
||||
// Dolby vision with Profile 10 is equivalent to DolbyVisionProfileDvav110 of framework
|
||||
// media codec constants.
|
||||
return profile != 10;
|
||||
}
|
||||
return sampleMimeType.equals(MimeTypes.VIDEO_H264)
|
||||
|| sampleMimeType.equals(MimeTypes.VIDEO_H265);
|
||||
}
|
||||
|
@ -32,11 +32,15 @@ import androidx.media3.common.ColorInfo;
|
||||
import androidx.media3.common.Format;
|
||||
import androidx.media3.common.MimeTypes;
|
||||
import androidx.media3.common.util.CodecSpecificDataUtil;
|
||||
import androidx.media3.common.util.Log;
|
||||
import androidx.media3.common.util.ParsableByteArray;
|
||||
import androidx.media3.common.util.Util;
|
||||
import androidx.media3.container.DolbyVisionConfig;
|
||||
import androidx.media3.container.MdtaMetadataEntry;
|
||||
import androidx.media3.container.Mp4LocationData;
|
||||
import androidx.media3.container.NalUnitUtil;
|
||||
import androidx.media3.muxer.FragmentedMp4Writer.SampleMetadata;
|
||||
import com.google.common.base.Splitter;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
@ -91,6 +95,8 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
|
||||
*/
|
||||
private static final int TRUN_BOX_NON_SYNC_SAMPLE_FLAGS = 0b00000001_00000001_00000000_00000000;
|
||||
|
||||
private static final String TAG = "Boxes";
|
||||
|
||||
private Boxes() {}
|
||||
|
||||
public static final ImmutableList<Byte> XMP_UUID =
|
||||
@ -722,6 +728,8 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
|
||||
return esdsBox(format);
|
||||
case MimeTypes.VIDEO_VP9:
|
||||
return vpcCBox(format);
|
||||
case MimeTypes.VIDEO_DOLBY_VISION:
|
||||
return doviSpecificBox(format);
|
||||
default:
|
||||
throw new IllegalArgumentException("Unsupported format: " + mimeType);
|
||||
}
|
||||
@ -1547,6 +1555,34 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
|
||||
return BoxUtils.wrapIntoBox("av1C", ByteBuffer.wrap(csd0));
|
||||
}
|
||||
|
||||
/** Returns a dvcC/dvwC/dvvC vision box which will be included in dolby vision box. */
|
||||
private static ByteBuffer doviBox(int profile, byte[] csd) {
|
||||
checkArgument(csd.length > 0, "csd is empty for dovi box.");
|
||||
if (profile <= 7) {
|
||||
return BoxUtils.wrapIntoBox("dvcC", ByteBuffer.wrap(csd));
|
||||
} else if (profile <= 10) {
|
||||
return BoxUtils.wrapIntoBox("dvvC", ByteBuffer.wrap(csd));
|
||||
} else if (profile <= 19) {
|
||||
return BoxUtils.wrapIntoBox("dvwC", ByteBuffer.wrap(csd));
|
||||
} else if (profile == 20) {
|
||||
return BoxUtils.wrapIntoBox("dvcC", ByteBuffer.wrap(csd));
|
||||
} else {
|
||||
return BoxUtils.wrapIntoBox("dvwC", ByteBuffer.wrap(csd));
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns a dolby vision box as per Dolby Vision ISO media format. */
|
||||
private static ByteBuffer doviSpecificBox(Format format) {
|
||||
checkArgument(
|
||||
!format.initializationData.isEmpty(), "csd is not found in the format for dolby vision");
|
||||
byte[] dolbyVisionCsd = Iterables.getLast(format.initializationData);
|
||||
DolbyVisionConfig dolbyVisionConfig = getDolbyVisionConfig(format);
|
||||
checkNotNull(dolbyVisionConfig, "Dolby vision codec is not supported.");
|
||||
ByteBuffer avcHevcBox = dolbyVisionConfig.profile <= 8 ? hvcCBox(format) : avcCBox(format);
|
||||
ByteBuffer dolbyBox = doviBox(dolbyVisionConfig.profile, dolbyVisionCsd);
|
||||
return BoxUtils.concatenateBuffers(avcHevcBox, dolbyBox);
|
||||
}
|
||||
|
||||
/** Returns the vpcC box as per VP Codec ISO Media File Format Binding v1.0. */
|
||||
private static ByteBuffer vpcCBox(Format format) {
|
||||
// For VP9, the CodecPrivate or vpcCBox data is packed into csd-0.
|
||||
@ -1690,6 +1726,45 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
|
||||
return BoxUtils.wrapIntoBox("colr", contents);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static DolbyVisionConfig getDolbyVisionConfig(Format format) {
|
||||
@Nullable
|
||||
DolbyVisionConfig dolbyVisionConfig =
|
||||
DolbyVisionConfig.parse(
|
||||
new ParsableByteArray(Iterables.getLast(format.initializationData)));
|
||||
if (dolbyVisionConfig == null && format.codecs != null) {
|
||||
Pair<Integer, Integer> profileAndLevel = getDolbyVisionProfileAndLevel(format);
|
||||
checkNotNull(profileAndLevel, "Dolby Vision profile and level is not found.");
|
||||
byte[] dolbyVisionCsd =
|
||||
CodecSpecificDataUtil.buildDolbyVisionInitializationData(
|
||||
/* profile= */ profileAndLevel.first, /* level= */ profileAndLevel.second);
|
||||
dolbyVisionConfig = DolbyVisionConfig.parse(new ParsableByteArray(dolbyVisionCsd));
|
||||
}
|
||||
return dolbyVisionConfig;
|
||||
}
|
||||
|
||||
/** Returns codec specific fourcc for Dolby vision. */
|
||||
private static String getDoviFourcc(Format format) {
|
||||
@Nullable DolbyVisionConfig dolbyVisionConfig = getDolbyVisionConfig(format);
|
||||
checkNotNull(
|
||||
dolbyVisionConfig,
|
||||
"Dolby Vision Initialization data is not found for format: %s" + format.sampleMimeType);
|
||||
switch (dolbyVisionConfig.profile) {
|
||||
case 5:
|
||||
return "dvh1";
|
||||
case 8:
|
||||
return "hvc1";
|
||||
case 9:
|
||||
return "avc1";
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"Unsupported profile "
|
||||
+ dolbyVisionConfig.profile
|
||||
+ " for format: "
|
||||
+ format.sampleMimeType);
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns codec specific fourcc. */
|
||||
private static String codecSpecificFourcc(Format format) {
|
||||
String mimeType = checkNotNull(format.sampleMimeType);
|
||||
@ -1725,6 +1800,8 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
|
||||
return "mp4v-es";
|
||||
case MimeTypes.VIDEO_VP9:
|
||||
return "vp09";
|
||||
case MimeTypes.VIDEO_DOLBY_VISION:
|
||||
return getDoviFourcc(format);
|
||||
default:
|
||||
throw new IllegalArgumentException("Unsupported format: " + mimeType);
|
||||
}
|
||||
@ -1943,4 +2020,19 @@ import org.checkerframework.checker.nullness.qual.PolyNull;
|
||||
}
|
||||
return minInputPtsUs != Long.MAX_VALUE ? minInputPtsUs : C.TIME_UNSET;
|
||||
}
|
||||
|
||||
/** Returns profile and level of dolby vision */
|
||||
@Nullable
|
||||
/* package */ static Pair<Integer, Integer> getDolbyVisionProfileAndLevel(Format format) {
|
||||
checkNotNull(format.codecs, "Codec string is null for Dolby Vision format.");
|
||||
List<String> parts = Splitter.on('.').splitToList(format.codecs);
|
||||
if (parts.size() < 3) {
|
||||
// The codec has fewer parts than required by the Dolby Vision codec string format.
|
||||
Log.w(TAG, "Invalid Dolby Vision codec string: " + format.codecs);
|
||||
return null;
|
||||
}
|
||||
int profile = Integer.parseInt(parts.get(1));
|
||||
int level = Integer.parseInt(parts.get(2));
|
||||
return Pair.create(profile, level);
|
||||
}
|
||||
}
|
||||
|
@ -49,6 +49,7 @@ import java.nio.ByteBuffer;
|
||||
* <li>H.265 (HEVC)
|
||||
* <li>VP9
|
||||
* <li>APV
|
||||
* <li>Dolby Vision
|
||||
* </ul>
|
||||
* <li>Audio Codecs:
|
||||
* <ul>
|
||||
@ -152,7 +153,8 @@ public final class FragmentedMp4Muxer implements AutoCloseable {
|
||||
MimeTypes.VIDEO_H265,
|
||||
MimeTypes.VIDEO_MP4V,
|
||||
MimeTypes.VIDEO_VP9,
|
||||
MimeTypes.VIDEO_APV);
|
||||
MimeTypes.VIDEO_APV,
|
||||
MimeTypes.VIDEO_DOLBY_VISION);
|
||||
|
||||
/** A list of supported audio {@linkplain MimeTypes sample MIME types}. */
|
||||
public static final ImmutableList<String> SUPPORTED_AUDIO_SAMPLE_MIME_TYPES =
|
||||
|
@ -352,7 +352,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
ImmutableList.Builder<ByteBuffer> pendingSamplesByteBuffer = new ImmutableList.Builder<>();
|
||||
ImmutableList.Builder<BufferInfo> pendingSamplesBufferInfoBuilder =
|
||||
new ImmutableList.Builder<>();
|
||||
if (doesSampleContainAnnexBNalUnits(checkNotNull(track.format.sampleMimeType))) {
|
||||
if (doesSampleContainAnnexBNalUnits(track.format)) {
|
||||
while (!track.pendingSamplesByteBuffer.isEmpty()) {
|
||||
ByteBuffer currentSampleByteBuffer = track.pendingSamplesByteBuffer.removeFirst();
|
||||
currentSampleByteBuffer =
|
||||
|
@ -72,6 +72,7 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
|
||||
* <li>H.265 (HEVC)
|
||||
* <li>VP9
|
||||
* <li>APV
|
||||
* <li>Dolby Vision
|
||||
* </ul>
|
||||
* <li>Audio Codecs:
|
||||
* <ul>
|
||||
@ -354,7 +355,8 @@ public final class Mp4Muxer implements AutoCloseable {
|
||||
MimeTypes.VIDEO_H265,
|
||||
MimeTypes.VIDEO_MP4V,
|
||||
MimeTypes.VIDEO_VP9,
|
||||
MimeTypes.VIDEO_APV);
|
||||
MimeTypes.VIDEO_APV,
|
||||
MimeTypes.VIDEO_DOLBY_VISION);
|
||||
|
||||
/** A list of supported audio {@linkplain MimeTypes sample MIME types}. */
|
||||
public static final ImmutableList<String> SUPPORTED_AUDIO_SAMPLE_MIME_TYPES =
|
||||
|
@ -467,7 +467,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
// Convert the H.264/H.265 samples from Annex-B format (output by MediaCodec) to
|
||||
// Avcc format (required by MP4 container).
|
||||
if (doesSampleContainAnnexBNalUnits(checkNotNull(track.format.sampleMimeType))) {
|
||||
if (doesSampleContainAnnexBNalUnits(track.format)) {
|
||||
currentSampleByteBuffer =
|
||||
annexBToAvccConverter.process(currentSampleByteBuffer, linearByteBufferAllocator);
|
||||
currentSampleBufferInfo =
|
||||
|
@ -63,6 +63,8 @@ public class FragmentedMp4MuxerEndToEndTest {
|
||||
"bbb_800x640_768kbps_30fps_avc_pyramid_3b.mp4";
|
||||
private static final String H264_WITH_FIRST_PTS_10_SEC =
|
||||
"bbb_800x640_768kbps_30fps_avc_2b_firstpts_10_sec.mp4";
|
||||
private static final String H264_DOLBY_VISION = "video_dovi_1920x1080_60fps_dvav_09.mp4";
|
||||
private static final String H265_DOLBY_VISION = "sample_edit_list.mp4";
|
||||
private static final String H265_HDR10_MP4 = "hdr10-720p.mp4";
|
||||
private static final String H265_WITH_METADATA_TRACK_MP4 = "h265_with_metadata_track.mp4";
|
||||
private static final String APV_MP4 = "sample_with_apvc.mp4";
|
||||
@ -88,6 +90,8 @@ public class FragmentedMp4MuxerEndToEndTest {
|
||||
H264_WITH_NON_REFERENCE_B_FRAMES_MP4,
|
||||
H264_WITH_PYRAMID_B_FRAMES_MP4,
|
||||
H264_WITH_FIRST_PTS_10_SEC,
|
||||
H264_DOLBY_VISION,
|
||||
H265_DOLBY_VISION,
|
||||
H265_HDR10_MP4,
|
||||
H265_WITH_METADATA_TRACK_MP4,
|
||||
APV_MP4,
|
||||
|
@ -52,6 +52,9 @@ public class Mp4MuxerEndToEndParameterizedTest {
|
||||
"bbb_800x640_768kbps_30fps_avc_pyramid_3b.mp4";
|
||||
private static final String H264_WITH_FIRST_PTS_10_SEC =
|
||||
"bbb_800x640_768kbps_30fps_avc_2b_firstpts_10_sec.mp4";
|
||||
private static final String H264_DOLBY_VISION = "video_dovi_1920x1080_60fps_dvav_09.mp4";
|
||||
private static final String H265_DOLBY_VISION = "sample_edit_list.mp4";
|
||||
|
||||
private static final String H265_HDR10_MP4 = "hdr10-720p.mp4";
|
||||
private static final String H265_WITH_METADATA_TRACK_MP4 = "h265_with_metadata_track.mp4";
|
||||
private static final String APV_MP4 = "sample_with_apvc.mp4";
|
||||
@ -76,6 +79,8 @@ public class Mp4MuxerEndToEndParameterizedTest {
|
||||
H264_WITH_NON_REFERENCE_B_FRAMES_MP4,
|
||||
H264_WITH_PYRAMID_B_FRAMES_MP4,
|
||||
H264_WITH_FIRST_PTS_10_SEC,
|
||||
H264_DOLBY_VISION,
|
||||
H265_DOLBY_VISION,
|
||||
H265_HDR10_MP4,
|
||||
H265_WITH_METADATA_TRACK_MP4,
|
||||
APV_MP4,
|
||||
|
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,672 @@
|
||||
seekMap:
|
||||
isSeekable = true
|
||||
duration = 1284200
|
||||
getPosition(0) = [[timeUs=0, position=400052]]
|
||||
getPosition(1) = [[timeUs=0, position=400052]]
|
||||
getPosition(642100) = [[timeUs=0, position=400052]]
|
||||
getPosition(1284200) = [[timeUs=0, position=400052]]
|
||||
numberOfTracks = 2
|
||||
track 0:
|
||||
total output bytes = 3324667
|
||||
sample count = 77
|
||||
track duration = 1284200
|
||||
format 0:
|
||||
averageBitrate = 20711404
|
||||
id = 1
|
||||
containerMimeType = video/mp4
|
||||
sampleMimeType = video/dolby-vision
|
||||
codecs = dvav.09.05
|
||||
maxInputSize = 781952
|
||||
maxNumReorderSamples = 3
|
||||
width = 1920
|
||||
height = 1080
|
||||
frameRate = 59.96
|
||||
colorInfo:
|
||||
lumaBitdepth = 8
|
||||
chromaBitdepth = 8
|
||||
language = und
|
||||
metadata = entries=[Mp4Timestamp: creation time=100000000, modification time=500000000, timescale=10000]
|
||||
initializationData:
|
||||
data = length 41, hash CD082D34
|
||||
data = length 8, hash 9481C0CD
|
||||
data = length 24, hash 20B6EE9B
|
||||
sample 0:
|
||||
time = 0
|
||||
flags = 1
|
||||
data = length 781922, hash EAC5ED5A
|
||||
sample 1:
|
||||
time = 83388
|
||||
flags = 0
|
||||
data = length 232985, hash D45F1B0A
|
||||
sample 2:
|
||||
time = 50033
|
||||
flags = 0
|
||||
data = length 11283, hash 4871C6EB
|
||||
sample 3:
|
||||
time = 33355
|
||||
flags = 0
|
||||
data = length 6441, hash 3F9B8083
|
||||
sample 4:
|
||||
time = 16677
|
||||
flags = 0
|
||||
data = length 4525, hash 96F38A16
|
||||
sample 5:
|
||||
time = 66711
|
||||
flags = 0
|
||||
data = length 4081, hash 9A9DE7BD
|
||||
sample 6:
|
||||
time = 216811
|
||||
flags = 0
|
||||
data = length 187842, hash 5422A68E
|
||||
sample 7:
|
||||
time = 150100
|
||||
flags = 0
|
||||
data = length 18122, hash 3FE383BF
|
||||
sample 8:
|
||||
time = 116744
|
||||
flags = 0
|
||||
data = length 10966, hash B66E17B7
|
||||
sample 9:
|
||||
time = 100066
|
||||
flags = 0
|
||||
data = length 3691, hash F0493245
|
||||
sample 10:
|
||||
time = 133422
|
||||
flags = 0
|
||||
data = length 5209, hash 66D450E3
|
||||
sample 11:
|
||||
time = 183455
|
||||
flags = 0
|
||||
data = length 8887, hash 8F62FF72
|
||||
sample 12:
|
||||
time = 166777
|
||||
flags = 0
|
||||
data = length 4421, hash 6F5A2760
|
||||
sample 13:
|
||||
time = 200133
|
||||
flags = 0
|
||||
data = length 4358, hash 819890AF
|
||||
sample 14:
|
||||
time = 333555
|
||||
flags = 0
|
||||
data = length 158508, hash 29421FCA
|
||||
sample 15:
|
||||
time = 283522
|
||||
flags = 0
|
||||
data = length 23465, hash D85A9C2D
|
||||
sample 16:
|
||||
time = 250166
|
||||
flags = 0
|
||||
data = length 11247, hash 78AD566F
|
||||
sample 17:
|
||||
time = 233488
|
||||
flags = 0
|
||||
data = length 4795, hash F176D1A0
|
||||
sample 18:
|
||||
time = 266844
|
||||
flags = 0
|
||||
data = length 5490, hash E03766E6
|
||||
sample 19:
|
||||
time = 316877
|
||||
flags = 0
|
||||
data = length 6721, hash 3043796
|
||||
sample 20:
|
||||
time = 300200
|
||||
flags = 0
|
||||
data = length 6060, hash DE8104BD
|
||||
sample 21:
|
||||
time = 466977
|
||||
flags = 0
|
||||
data = length 195120, hash 8FD2B747
|
||||
sample 22:
|
||||
time = 400266
|
||||
flags = 0
|
||||
data = length 24836, hash C5968564
|
||||
sample 23:
|
||||
time = 366911
|
||||
flags = 0
|
||||
data = length 9890, hash 77347FA9
|
||||
sample 24:
|
||||
time = 350233
|
||||
flags = 0
|
||||
data = length 4362, hash 87FFBB13
|
||||
sample 25:
|
||||
time = 383588
|
||||
flags = 0
|
||||
data = length 4885, hash 45316A9E
|
||||
sample 26:
|
||||
time = 433622
|
||||
flags = 0
|
||||
data = length 9400, hash B3303C68
|
||||
sample 27:
|
||||
time = 416944
|
||||
flags = 0
|
||||
data = length 5342, hash BDC7B122
|
||||
sample 28:
|
||||
time = 450300
|
||||
flags = 0
|
||||
data = length 4136, hash 3961B8BD
|
||||
sample 29:
|
||||
time = 550366
|
||||
flags = 0
|
||||
data = length 189773, hash 1ED63831
|
||||
sample 30:
|
||||
time = 517011
|
||||
flags = 0
|
||||
data = length 10883, hash 39B8EBAF
|
||||
sample 31:
|
||||
time = 500333
|
||||
flags = 0
|
||||
data = length 7259, hash E5048978
|
||||
sample 32:
|
||||
time = 483655
|
||||
flags = 0
|
||||
data = length 4858, hash 16B83C06
|
||||
sample 33:
|
||||
time = 533688
|
||||
flags = 0
|
||||
data = length 5611, hash 6AA28014
|
||||
sample 34:
|
||||
time = 633755
|
||||
flags = 0
|
||||
data = length 226650, hash 84F709AB
|
||||
sample 35:
|
||||
time = 600400
|
||||
flags = 0
|
||||
data = length 10378, hash 34DFFE44
|
||||
sample 36:
|
||||
time = 583722
|
||||
flags = 0
|
||||
data = length 8627, hash 7C06E5C6
|
||||
sample 37:
|
||||
time = 567044
|
||||
flags = 0
|
||||
data = length 6675, hash A031BF31
|
||||
sample 38:
|
||||
time = 617077
|
||||
flags = 0
|
||||
data = length 6097, hash 69DCD00C
|
||||
sample 39:
|
||||
time = 700466
|
||||
flags = 0
|
||||
data = length 187498, hash C9F64D34
|
||||
sample 40:
|
||||
time = 667111
|
||||
flags = 0
|
||||
data = length 8801, hash DADE42B2
|
||||
sample 41:
|
||||
time = 650433
|
||||
flags = 0
|
||||
data = length 5722, hash 58A3AB0E
|
||||
sample 42:
|
||||
time = 683788
|
||||
flags = 0
|
||||
data = length 4173, hash 7D6DA063
|
||||
sample 43:
|
||||
time = 767177
|
||||
flags = 0
|
||||
data = length 183855, hash 996A0D0B
|
||||
sample 44:
|
||||
time = 733822
|
||||
flags = 0
|
||||
data = length 7942, hash 4B02B7FC
|
||||
sample 45:
|
||||
time = 717144
|
||||
flags = 0
|
||||
data = length 5209, hash 692EE1FC
|
||||
sample 46:
|
||||
time = 750500
|
||||
flags = 0
|
||||
data = length 4518, hash 9B71E0F1
|
||||
sample 47:
|
||||
time = 900600
|
||||
flags = 0
|
||||
data = length 171861, hash B873F987
|
||||
sample 48:
|
||||
time = 833888
|
||||
flags = 0
|
||||
data = length 21001, hash 5B0D727A
|
||||
sample 49:
|
||||
time = 800533
|
||||
flags = 0
|
||||
data = length 9532, hash 6932E709
|
||||
sample 50:
|
||||
time = 783855
|
||||
flags = 0
|
||||
data = length 4211, hash F13B567D
|
||||
sample 51:
|
||||
time = 817211
|
||||
flags = 0
|
||||
data = length 4920, hash E21E3458
|
||||
sample 52:
|
||||
time = 867244
|
||||
flags = 0
|
||||
data = length 9167, hash F2EC1662
|
||||
sample 53:
|
||||
time = 850566
|
||||
flags = 0
|
||||
data = length 4212, hash 5976451D
|
||||
sample 54:
|
||||
time = 883922
|
||||
flags = 0
|
||||
data = length 4286, hash 1B2B6FB5
|
||||
sample 55:
|
||||
time = 1034022
|
||||
flags = 0
|
||||
data = length 144185, hash 97A28C82
|
||||
sample 56:
|
||||
time = 967311
|
||||
flags = 0
|
||||
data = length 20741, hash 6374F2D6
|
||||
sample 57:
|
||||
time = 933955
|
||||
flags = 0
|
||||
data = length 8603, hash 188497E7
|
||||
sample 58:
|
||||
time = 917277
|
||||
flags = 0
|
||||
data = length 3727, hash 8385995D
|
||||
sample 59:
|
||||
time = 950633
|
||||
flags = 0
|
||||
data = length 4415, hash 84E1074
|
||||
sample 60:
|
||||
time = 1000666
|
||||
flags = 0
|
||||
data = length 9101, hash DB81A03
|
||||
sample 61:
|
||||
time = 983988
|
||||
flags = 0
|
||||
data = length 4531, hash 605DDD0A
|
||||
sample 62:
|
||||
time = 1017344
|
||||
flags = 0
|
||||
data = length 4201, hash 3919361A
|
||||
sample 63:
|
||||
time = 1134088
|
||||
flags = 0
|
||||
data = length 100876, hash 1BD95B61
|
||||
sample 64:
|
||||
time = 1084055
|
||||
flags = 0
|
||||
data = length 15681, hash FC769391
|
||||
sample 65:
|
||||
time = 1067377
|
||||
flags = 0
|
||||
data = length 6817, hash 8CF14B05
|
||||
sample 66:
|
||||
time = 1050700
|
||||
flags = 0
|
||||
data = length 3927, hash 5BE4D2FC
|
||||
sample 67:
|
||||
time = 1117411
|
||||
flags = 0
|
||||
data = length 5589, hash 1A76E43B
|
||||
sample 68:
|
||||
time = 1100733
|
||||
flags = 0
|
||||
data = length 4350, hash 98211199
|
||||
sample 69:
|
||||
time = 1217477
|
||||
flags = 0
|
||||
data = length 51089, hash 35EC3C41
|
||||
sample 70:
|
||||
time = 1184122
|
||||
flags = 0
|
||||
data = length 14567, hash B15DBDBC
|
||||
sample 71:
|
||||
time = 1167444
|
||||
flags = 0
|
||||
data = length 7552, hash AE195424
|
||||
sample 72:
|
||||
time = 1150766
|
||||
flags = 0
|
||||
data = length 4193, hash 35AB5623
|
||||
sample 73:
|
||||
time = 1200800
|
||||
flags = 0
|
||||
data = length 5423, hash 24FFCED
|
||||
sample 74:
|
||||
time = 1267511
|
||||
flags = 0
|
||||
data = length 16168, hash D6C052C2
|
||||
sample 75:
|
||||
time = 1250833
|
||||
flags = 0
|
||||
data = length 9809, hash D833D9F8
|
||||
sample 76:
|
||||
time = 1234155
|
||||
flags = 536870912
|
||||
data = length 6413, hash 6E770E44
|
||||
track 1:
|
||||
total output bytes = 3324667
|
||||
sample count = 77
|
||||
track duration = 1284200
|
||||
format 0:
|
||||
averageBitrate = 20711404
|
||||
id = 2
|
||||
containerMimeType = video/mp4
|
||||
sampleMimeType = video/avc
|
||||
codecs = avc1.64002A
|
||||
maxInputSize = 781952
|
||||
maxNumReorderSamples = 3
|
||||
width = 1920
|
||||
height = 1080
|
||||
frameRate = 59.96
|
||||
colorInfo:
|
||||
lumaBitdepth = 8
|
||||
chromaBitdepth = 8
|
||||
language = und
|
||||
metadata = entries=[Mp4Timestamp: creation time=100000000, modification time=500000000, timescale=10000]
|
||||
initializationData:
|
||||
data = length 41, hash CD082D34
|
||||
data = length 8, hash 9481C0CD
|
||||
sample 0:
|
||||
time = 0
|
||||
flags = 1
|
||||
data = length 781922, hash EAC5ED5A
|
||||
sample 1:
|
||||
time = 83388
|
||||
flags = 0
|
||||
data = length 232985, hash D45F1B0A
|
||||
sample 2:
|
||||
time = 50033
|
||||
flags = 0
|
||||
data = length 11283, hash 4871C6EB
|
||||
sample 3:
|
||||
time = 33355
|
||||
flags = 0
|
||||
data = length 6441, hash 3F9B8083
|
||||
sample 4:
|
||||
time = 16677
|
||||
flags = 0
|
||||
data = length 4525, hash 96F38A16
|
||||
sample 5:
|
||||
time = 66711
|
||||
flags = 0
|
||||
data = length 4081, hash 9A9DE7BD
|
||||
sample 6:
|
||||
time = 216811
|
||||
flags = 0
|
||||
data = length 187842, hash 5422A68E
|
||||
sample 7:
|
||||
time = 150100
|
||||
flags = 0
|
||||
data = length 18122, hash 3FE383BF
|
||||
sample 8:
|
||||
time = 116744
|
||||
flags = 0
|
||||
data = length 10966, hash B66E17B7
|
||||
sample 9:
|
||||
time = 100066
|
||||
flags = 0
|
||||
data = length 3691, hash F0493245
|
||||
sample 10:
|
||||
time = 133422
|
||||
flags = 0
|
||||
data = length 5209, hash 66D450E3
|
||||
sample 11:
|
||||
time = 183455
|
||||
flags = 0
|
||||
data = length 8887, hash 8F62FF72
|
||||
sample 12:
|
||||
time = 166777
|
||||
flags = 0
|
||||
data = length 4421, hash 6F5A2760
|
||||
sample 13:
|
||||
time = 200133
|
||||
flags = 0
|
||||
data = length 4358, hash 819890AF
|
||||
sample 14:
|
||||
time = 333555
|
||||
flags = 0
|
||||
data = length 158508, hash 29421FCA
|
||||
sample 15:
|
||||
time = 283522
|
||||
flags = 0
|
||||
data = length 23465, hash D85A9C2D
|
||||
sample 16:
|
||||
time = 250166
|
||||
flags = 0
|
||||
data = length 11247, hash 78AD566F
|
||||
sample 17:
|
||||
time = 233488
|
||||
flags = 0
|
||||
data = length 4795, hash F176D1A0
|
||||
sample 18:
|
||||
time = 266844
|
||||
flags = 0
|
||||
data = length 5490, hash E03766E6
|
||||
sample 19:
|
||||
time = 316877
|
||||
flags = 0
|
||||
data = length 6721, hash 3043796
|
||||
sample 20:
|
||||
time = 300200
|
||||
flags = 0
|
||||
data = length 6060, hash DE8104BD
|
||||
sample 21:
|
||||
time = 466977
|
||||
flags = 0
|
||||
data = length 195120, hash 8FD2B747
|
||||
sample 22:
|
||||
time = 400266
|
||||
flags = 0
|
||||
data = length 24836, hash C5968564
|
||||
sample 23:
|
||||
time = 366911
|
||||
flags = 0
|
||||
data = length 9890, hash 77347FA9
|
||||
sample 24:
|
||||
time = 350233
|
||||
flags = 0
|
||||
data = length 4362, hash 87FFBB13
|
||||
sample 25:
|
||||
time = 383588
|
||||
flags = 0
|
||||
data = length 4885, hash 45316A9E
|
||||
sample 26:
|
||||
time = 433622
|
||||
flags = 0
|
||||
data = length 9400, hash B3303C68
|
||||
sample 27:
|
||||
time = 416944
|
||||
flags = 0
|
||||
data = length 5342, hash BDC7B122
|
||||
sample 28:
|
||||
time = 450300
|
||||
flags = 0
|
||||
data = length 4136, hash 3961B8BD
|
||||
sample 29:
|
||||
time = 550366
|
||||
flags = 0
|
||||
data = length 189773, hash 1ED63831
|
||||
sample 30:
|
||||
time = 517011
|
||||
flags = 0
|
||||
data = length 10883, hash 39B8EBAF
|
||||
sample 31:
|
||||
time = 500333
|
||||
flags = 0
|
||||
data = length 7259, hash E5048978
|
||||
sample 32:
|
||||
time = 483655
|
||||
flags = 0
|
||||
data = length 4858, hash 16B83C06
|
||||
sample 33:
|
||||
time = 533688
|
||||
flags = 0
|
||||
data = length 5611, hash 6AA28014
|
||||
sample 34:
|
||||
time = 633755
|
||||
flags = 0
|
||||
data = length 226650, hash 84F709AB
|
||||
sample 35:
|
||||
time = 600400
|
||||
flags = 0
|
||||
data = length 10378, hash 34DFFE44
|
||||
sample 36:
|
||||
time = 583722
|
||||
flags = 0
|
||||
data = length 8627, hash 7C06E5C6
|
||||
sample 37:
|
||||
time = 567044
|
||||
flags = 0
|
||||
data = length 6675, hash A031BF31
|
||||
sample 38:
|
||||
time = 617077
|
||||
flags = 0
|
||||
data = length 6097, hash 69DCD00C
|
||||
sample 39:
|
||||
time = 700466
|
||||
flags = 0
|
||||
data = length 187498, hash C9F64D34
|
||||
sample 40:
|
||||
time = 667111
|
||||
flags = 0
|
||||
data = length 8801, hash DADE42B2
|
||||
sample 41:
|
||||
time = 650433
|
||||
flags = 0
|
||||
data = length 5722, hash 58A3AB0E
|
||||
sample 42:
|
||||
time = 683788
|
||||
flags = 0
|
||||
data = length 4173, hash 7D6DA063
|
||||
sample 43:
|
||||
time = 767177
|
||||
flags = 0
|
||||
data = length 183855, hash 996A0D0B
|
||||
sample 44:
|
||||
time = 733822
|
||||
flags = 0
|
||||
data = length 7942, hash 4B02B7FC
|
||||
sample 45:
|
||||
time = 717144
|
||||
flags = 0
|
||||
data = length 5209, hash 692EE1FC
|
||||
sample 46:
|
||||
time = 750500
|
||||
flags = 0
|
||||
data = length 4518, hash 9B71E0F1
|
||||
sample 47:
|
||||
time = 900600
|
||||
flags = 0
|
||||
data = length 171861, hash B873F987
|
||||
sample 48:
|
||||
time = 833888
|
||||
flags = 0
|
||||
data = length 21001, hash 5B0D727A
|
||||
sample 49:
|
||||
time = 800533
|
||||
flags = 0
|
||||
data = length 9532, hash 6932E709
|
||||
sample 50:
|
||||
time = 783855
|
||||
flags = 0
|
||||
data = length 4211, hash F13B567D
|
||||
sample 51:
|
||||
time = 817211
|
||||
flags = 0
|
||||
data = length 4920, hash E21E3458
|
||||
sample 52:
|
||||
time = 867244
|
||||
flags = 0
|
||||
data = length 9167, hash F2EC1662
|
||||
sample 53:
|
||||
time = 850566
|
||||
flags = 0
|
||||
data = length 4212, hash 5976451D
|
||||
sample 54:
|
||||
time = 883922
|
||||
flags = 0
|
||||
data = length 4286, hash 1B2B6FB5
|
||||
sample 55:
|
||||
time = 1034022
|
||||
flags = 0
|
||||
data = length 144185, hash 97A28C82
|
||||
sample 56:
|
||||
time = 967311
|
||||
flags = 0
|
||||
data = length 20741, hash 6374F2D6
|
||||
sample 57:
|
||||
time = 933955
|
||||
flags = 0
|
||||
data = length 8603, hash 188497E7
|
||||
sample 58:
|
||||
time = 917277
|
||||
flags = 0
|
||||
data = length 3727, hash 8385995D
|
||||
sample 59:
|
||||
time = 950633
|
||||
flags = 0
|
||||
data = length 4415, hash 84E1074
|
||||
sample 60:
|
||||
time = 1000666
|
||||
flags = 0
|
||||
data = length 9101, hash DB81A03
|
||||
sample 61:
|
||||
time = 983988
|
||||
flags = 0
|
||||
data = length 4531, hash 605DDD0A
|
||||
sample 62:
|
||||
time = 1017344
|
||||
flags = 0
|
||||
data = length 4201, hash 3919361A
|
||||
sample 63:
|
||||
time = 1134088
|
||||
flags = 0
|
||||
data = length 100876, hash 1BD95B61
|
||||
sample 64:
|
||||
time = 1084055
|
||||
flags = 0
|
||||
data = length 15681, hash FC769391
|
||||
sample 65:
|
||||
time = 1067377
|
||||
flags = 0
|
||||
data = length 6817, hash 8CF14B05
|
||||
sample 66:
|
||||
time = 1050700
|
||||
flags = 0
|
||||
data = length 3927, hash 5BE4D2FC
|
||||
sample 67:
|
||||
time = 1117411
|
||||
flags = 0
|
||||
data = length 5589, hash 1A76E43B
|
||||
sample 68:
|
||||
time = 1100733
|
||||
flags = 0
|
||||
data = length 4350, hash 98211199
|
||||
sample 69:
|
||||
time = 1217477
|
||||
flags = 0
|
||||
data = length 51089, hash 35EC3C41
|
||||
sample 70:
|
||||
time = 1184122
|
||||
flags = 0
|
||||
data = length 14567, hash B15DBDBC
|
||||
sample 71:
|
||||
time = 1167444
|
||||
flags = 0
|
||||
data = length 7552, hash AE195424
|
||||
sample 72:
|
||||
time = 1150766
|
||||
flags = 0
|
||||
data = length 4193, hash 35AB5623
|
||||
sample 73:
|
||||
time = 1200800
|
||||
flags = 0
|
||||
data = length 5423, hash 24FFCED
|
||||
sample 74:
|
||||
time = 1267511
|
||||
flags = 0
|
||||
data = length 16168, hash D6C052C2
|
||||
sample 75:
|
||||
time = 1250833
|
||||
flags = 0
|
||||
data = length 9809, hash D833D9F8
|
||||
sample 76:
|
||||
time = 1234155
|
||||
flags = 536870912
|
||||
data = length 6413, hash 6E770E44
|
||||
tracksEnded = true
|
@ -0,0 +1,659 @@
|
||||
seekMap:
|
||||
isSeekable = false
|
||||
duration = UNSET TIME
|
||||
getPosition(0) = [[timeUs=0, position=1284]]
|
||||
numberOfTracks = 2
|
||||
track 0:
|
||||
total output bytes = 3324667
|
||||
sample count = 77
|
||||
format 0:
|
||||
id = 1
|
||||
containerMimeType = video/mp4
|
||||
sampleMimeType = video/dolby-vision
|
||||
codecs = dvav.09.05
|
||||
maxNumReorderSamples = 3
|
||||
width = 1920
|
||||
height = 1080
|
||||
colorInfo:
|
||||
lumaBitdepth = 8
|
||||
chromaBitdepth = 8
|
||||
language = und
|
||||
initializationData:
|
||||
data = length 41, hash CD082D34
|
||||
data = length 8, hash 9481C0CD
|
||||
data = length 24, hash 20B6EE9B
|
||||
sample 0:
|
||||
time = 0
|
||||
flags = 1
|
||||
data = length 781922, hash EAC5ED5A
|
||||
sample 1:
|
||||
time = 83388
|
||||
flags = 0
|
||||
data = length 232985, hash D45F1B0A
|
||||
sample 2:
|
||||
time = 50033
|
||||
flags = 0
|
||||
data = length 11283, hash 4871C6EB
|
||||
sample 3:
|
||||
time = 33355
|
||||
flags = 0
|
||||
data = length 6441, hash 3F9B8083
|
||||
sample 4:
|
||||
time = 16677
|
||||
flags = 0
|
||||
data = length 4525, hash 96F38A16
|
||||
sample 5:
|
||||
time = 66711
|
||||
flags = 0
|
||||
data = length 4081, hash 9A9DE7BD
|
||||
sample 6:
|
||||
time = 216811
|
||||
flags = 0
|
||||
data = length 187842, hash 5422A68E
|
||||
sample 7:
|
||||
time = 150100
|
||||
flags = 0
|
||||
data = length 18122, hash 3FE383BF
|
||||
sample 8:
|
||||
time = 116744
|
||||
flags = 0
|
||||
data = length 10966, hash B66E17B7
|
||||
sample 9:
|
||||
time = 100066
|
||||
flags = 0
|
||||
data = length 3691, hash F0493245
|
||||
sample 10:
|
||||
time = 133422
|
||||
flags = 0
|
||||
data = length 5209, hash 66D450E3
|
||||
sample 11:
|
||||
time = 183455
|
||||
flags = 0
|
||||
data = length 8887, hash 8F62FF72
|
||||
sample 12:
|
||||
time = 166777
|
||||
flags = 0
|
||||
data = length 4421, hash 6F5A2760
|
||||
sample 13:
|
||||
time = 200133
|
||||
flags = 0
|
||||
data = length 4358, hash 819890AF
|
||||
sample 14:
|
||||
time = 333555
|
||||
flags = 0
|
||||
data = length 158508, hash 29421FCA
|
||||
sample 15:
|
||||
time = 283522
|
||||
flags = 0
|
||||
data = length 23465, hash D85A9C2D
|
||||
sample 16:
|
||||
time = 250166
|
||||
flags = 0
|
||||
data = length 11247, hash 78AD566F
|
||||
sample 17:
|
||||
time = 233488
|
||||
flags = 0
|
||||
data = length 4795, hash F176D1A0
|
||||
sample 18:
|
||||
time = 266844
|
||||
flags = 0
|
||||
data = length 5490, hash E03766E6
|
||||
sample 19:
|
||||
time = 316877
|
||||
flags = 0
|
||||
data = length 6721, hash 3043796
|
||||
sample 20:
|
||||
time = 300200
|
||||
flags = 0
|
||||
data = length 6060, hash DE8104BD
|
||||
sample 21:
|
||||
time = 466977
|
||||
flags = 0
|
||||
data = length 195120, hash 8FD2B747
|
||||
sample 22:
|
||||
time = 400266
|
||||
flags = 0
|
||||
data = length 24836, hash C5968564
|
||||
sample 23:
|
||||
time = 366911
|
||||
flags = 0
|
||||
data = length 9890, hash 77347FA9
|
||||
sample 24:
|
||||
time = 350233
|
||||
flags = 0
|
||||
data = length 4362, hash 87FFBB13
|
||||
sample 25:
|
||||
time = 383588
|
||||
flags = 0
|
||||
data = length 4885, hash 45316A9E
|
||||
sample 26:
|
||||
time = 433622
|
||||
flags = 0
|
||||
data = length 9400, hash B3303C68
|
||||
sample 27:
|
||||
time = 416944
|
||||
flags = 0
|
||||
data = length 5342, hash BDC7B122
|
||||
sample 28:
|
||||
time = 450300
|
||||
flags = 0
|
||||
data = length 4136, hash 3961B8BD
|
||||
sample 29:
|
||||
time = 550366
|
||||
flags = 0
|
||||
data = length 189773, hash 1ED63831
|
||||
sample 30:
|
||||
time = 517011
|
||||
flags = 0
|
||||
data = length 10883, hash 39B8EBAF
|
||||
sample 31:
|
||||
time = 500333
|
||||
flags = 0
|
||||
data = length 7259, hash E5048978
|
||||
sample 32:
|
||||
time = 483655
|
||||
flags = 0
|
||||
data = length 4858, hash 16B83C06
|
||||
sample 33:
|
||||
time = 533688
|
||||
flags = 0
|
||||
data = length 5611, hash 6AA28014
|
||||
sample 34:
|
||||
time = 633755
|
||||
flags = 0
|
||||
data = length 226650, hash 84F709AB
|
||||
sample 35:
|
||||
time = 600400
|
||||
flags = 0
|
||||
data = length 10378, hash 34DFFE44
|
||||
sample 36:
|
||||
time = 583722
|
||||
flags = 0
|
||||
data = length 8627, hash 7C06E5C6
|
||||
sample 37:
|
||||
time = 567044
|
||||
flags = 0
|
||||
data = length 6675, hash A031BF31
|
||||
sample 38:
|
||||
time = 617077
|
||||
flags = 0
|
||||
data = length 6097, hash 69DCD00C
|
||||
sample 39:
|
||||
time = 700466
|
||||
flags = 0
|
||||
data = length 187498, hash C9F64D34
|
||||
sample 40:
|
||||
time = 667111
|
||||
flags = 0
|
||||
data = length 8801, hash DADE42B2
|
||||
sample 41:
|
||||
time = 650433
|
||||
flags = 0
|
||||
data = length 5722, hash 58A3AB0E
|
||||
sample 42:
|
||||
time = 683788
|
||||
flags = 0
|
||||
data = length 4173, hash 7D6DA063
|
||||
sample 43:
|
||||
time = 767177
|
||||
flags = 0
|
||||
data = length 183855, hash 996A0D0B
|
||||
sample 44:
|
||||
time = 733822
|
||||
flags = 0
|
||||
data = length 7942, hash 4B02B7FC
|
||||
sample 45:
|
||||
time = 717144
|
||||
flags = 0
|
||||
data = length 5209, hash 692EE1FC
|
||||
sample 46:
|
||||
time = 750500
|
||||
flags = 0
|
||||
data = length 4518, hash 9B71E0F1
|
||||
sample 47:
|
||||
time = 900600
|
||||
flags = 0
|
||||
data = length 171861, hash B873F987
|
||||
sample 48:
|
||||
time = 833888
|
||||
flags = 0
|
||||
data = length 21001, hash 5B0D727A
|
||||
sample 49:
|
||||
time = 800533
|
||||
flags = 0
|
||||
data = length 9532, hash 6932E709
|
||||
sample 50:
|
||||
time = 783855
|
||||
flags = 0
|
||||
data = length 4211, hash F13B567D
|
||||
sample 51:
|
||||
time = 817211
|
||||
flags = 0
|
||||
data = length 4920, hash E21E3458
|
||||
sample 52:
|
||||
time = 867244
|
||||
flags = 0
|
||||
data = length 9167, hash F2EC1662
|
||||
sample 53:
|
||||
time = 850566
|
||||
flags = 0
|
||||
data = length 4212, hash 5976451D
|
||||
sample 54:
|
||||
time = 883922
|
||||
flags = 0
|
||||
data = length 4286, hash 1B2B6FB5
|
||||
sample 55:
|
||||
time = 1034022
|
||||
flags = 0
|
||||
data = length 144185, hash 97A28C82
|
||||
sample 56:
|
||||
time = 967311
|
||||
flags = 0
|
||||
data = length 20741, hash 6374F2D6
|
||||
sample 57:
|
||||
time = 933955
|
||||
flags = 0
|
||||
data = length 8603, hash 188497E7
|
||||
sample 58:
|
||||
time = 917277
|
||||
flags = 0
|
||||
data = length 3727, hash 8385995D
|
||||
sample 59:
|
||||
time = 950633
|
||||
flags = 0
|
||||
data = length 4415, hash 84E1074
|
||||
sample 60:
|
||||
time = 1000666
|
||||
flags = 0
|
||||
data = length 9101, hash DB81A03
|
||||
sample 61:
|
||||
time = 983988
|
||||
flags = 0
|
||||
data = length 4531, hash 605DDD0A
|
||||
sample 62:
|
||||
time = 1017344
|
||||
flags = 0
|
||||
data = length 4201, hash 3919361A
|
||||
sample 63:
|
||||
time = 1134088
|
||||
flags = 0
|
||||
data = length 100876, hash 1BD95B61
|
||||
sample 64:
|
||||
time = 1084055
|
||||
flags = 0
|
||||
data = length 15681, hash FC769391
|
||||
sample 65:
|
||||
time = 1067377
|
||||
flags = 0
|
||||
data = length 6817, hash 8CF14B05
|
||||
sample 66:
|
||||
time = 1050700
|
||||
flags = 0
|
||||
data = length 3927, hash 5BE4D2FC
|
||||
sample 67:
|
||||
time = 1117411
|
||||
flags = 0
|
||||
data = length 5589, hash 1A76E43B
|
||||
sample 68:
|
||||
time = 1100733
|
||||
flags = 0
|
||||
data = length 4350, hash 98211199
|
||||
sample 69:
|
||||
time = 1217477
|
||||
flags = 0
|
||||
data = length 51089, hash 35EC3C41
|
||||
sample 70:
|
||||
time = 1184122
|
||||
flags = 0
|
||||
data = length 14567, hash B15DBDBC
|
||||
sample 71:
|
||||
time = 1167444
|
||||
flags = 0
|
||||
data = length 7552, hash AE195424
|
||||
sample 72:
|
||||
time = 1150766
|
||||
flags = 0
|
||||
data = length 4193, hash 35AB5623
|
||||
sample 73:
|
||||
time = 1200800
|
||||
flags = 0
|
||||
data = length 5423, hash 24FFCED
|
||||
sample 74:
|
||||
time = 1267511
|
||||
flags = 0
|
||||
data = length 16168, hash D6C052C2
|
||||
sample 75:
|
||||
time = 1250833
|
||||
flags = 0
|
||||
data = length 9809, hash D833D9F8
|
||||
sample 76:
|
||||
time = 1234155
|
||||
flags = 0
|
||||
data = length 6413, hash 6E770E44
|
||||
track 1:
|
||||
total output bytes = 3324667
|
||||
sample count = 77
|
||||
format 0:
|
||||
id = 2
|
||||
containerMimeType = video/mp4
|
||||
sampleMimeType = video/avc
|
||||
codecs = avc1.64002A
|
||||
maxNumReorderSamples = 3
|
||||
width = 1920
|
||||
height = 1080
|
||||
colorInfo:
|
||||
lumaBitdepth = 8
|
||||
chromaBitdepth = 8
|
||||
language = und
|
||||
initializationData:
|
||||
data = length 41, hash CD082D34
|
||||
data = length 8, hash 9481C0CD
|
||||
sample 0:
|
||||
time = 0
|
||||
flags = 1
|
||||
data = length 781922, hash EAC5ED5A
|
||||
sample 1:
|
||||
time = 83388
|
||||
flags = 0
|
||||
data = length 232985, hash D45F1B0A
|
||||
sample 2:
|
||||
time = 50033
|
||||
flags = 0
|
||||
data = length 11283, hash 4871C6EB
|
||||
sample 3:
|
||||
time = 33355
|
||||
flags = 0
|
||||
data = length 6441, hash 3F9B8083
|
||||
sample 4:
|
||||
time = 16677
|
||||
flags = 0
|
||||
data = length 4525, hash 96F38A16
|
||||
sample 5:
|
||||
time = 66711
|
||||
flags = 0
|
||||
data = length 4081, hash 9A9DE7BD
|
||||
sample 6:
|
||||
time = 216811
|
||||
flags = 0
|
||||
data = length 187842, hash 5422A68E
|
||||
sample 7:
|
||||
time = 150100
|
||||
flags = 0
|
||||
data = length 18122, hash 3FE383BF
|
||||
sample 8:
|
||||
time = 116744
|
||||
flags = 0
|
||||
data = length 10966, hash B66E17B7
|
||||
sample 9:
|
||||
time = 100066
|
||||
flags = 0
|
||||
data = length 3691, hash F0493245
|
||||
sample 10:
|
||||
time = 133422
|
||||
flags = 0
|
||||
data = length 5209, hash 66D450E3
|
||||
sample 11:
|
||||
time = 183455
|
||||
flags = 0
|
||||
data = length 8887, hash 8F62FF72
|
||||
sample 12:
|
||||
time = 166777
|
||||
flags = 0
|
||||
data = length 4421, hash 6F5A2760
|
||||
sample 13:
|
||||
time = 200133
|
||||
flags = 0
|
||||
data = length 4358, hash 819890AF
|
||||
sample 14:
|
||||
time = 333555
|
||||
flags = 0
|
||||
data = length 158508, hash 29421FCA
|
||||
sample 15:
|
||||
time = 283522
|
||||
flags = 0
|
||||
data = length 23465, hash D85A9C2D
|
||||
sample 16:
|
||||
time = 250166
|
||||
flags = 0
|
||||
data = length 11247, hash 78AD566F
|
||||
sample 17:
|
||||
time = 233488
|
||||
flags = 0
|
||||
data = length 4795, hash F176D1A0
|
||||
sample 18:
|
||||
time = 266844
|
||||
flags = 0
|
||||
data = length 5490, hash E03766E6
|
||||
sample 19:
|
||||
time = 316877
|
||||
flags = 0
|
||||
data = length 6721, hash 3043796
|
||||
sample 20:
|
||||
time = 300200
|
||||
flags = 0
|
||||
data = length 6060, hash DE8104BD
|
||||
sample 21:
|
||||
time = 466977
|
||||
flags = 0
|
||||
data = length 195120, hash 8FD2B747
|
||||
sample 22:
|
||||
time = 400266
|
||||
flags = 0
|
||||
data = length 24836, hash C5968564
|
||||
sample 23:
|
||||
time = 366911
|
||||
flags = 0
|
||||
data = length 9890, hash 77347FA9
|
||||
sample 24:
|
||||
time = 350233
|
||||
flags = 0
|
||||
data = length 4362, hash 87FFBB13
|
||||
sample 25:
|
||||
time = 383588
|
||||
flags = 0
|
||||
data = length 4885, hash 45316A9E
|
||||
sample 26:
|
||||
time = 433622
|
||||
flags = 0
|
||||
data = length 9400, hash B3303C68
|
||||
sample 27:
|
||||
time = 416944
|
||||
flags = 0
|
||||
data = length 5342, hash BDC7B122
|
||||
sample 28:
|
||||
time = 450300
|
||||
flags = 0
|
||||
data = length 4136, hash 3961B8BD
|
||||
sample 29:
|
||||
time = 550366
|
||||
flags = 0
|
||||
data = length 189773, hash 1ED63831
|
||||
sample 30:
|
||||
time = 517011
|
||||
flags = 0
|
||||
data = length 10883, hash 39B8EBAF
|
||||
sample 31:
|
||||
time = 500333
|
||||
flags = 0
|
||||
data = length 7259, hash E5048978
|
||||
sample 32:
|
||||
time = 483655
|
||||
flags = 0
|
||||
data = length 4858, hash 16B83C06
|
||||
sample 33:
|
||||
time = 533688
|
||||
flags = 0
|
||||
data = length 5611, hash 6AA28014
|
||||
sample 34:
|
||||
time = 633755
|
||||
flags = 0
|
||||
data = length 226650, hash 84F709AB
|
||||
sample 35:
|
||||
time = 600400
|
||||
flags = 0
|
||||
data = length 10378, hash 34DFFE44
|
||||
sample 36:
|
||||
time = 583722
|
||||
flags = 0
|
||||
data = length 8627, hash 7C06E5C6
|
||||
sample 37:
|
||||
time = 567044
|
||||
flags = 0
|
||||
data = length 6675, hash A031BF31
|
||||
sample 38:
|
||||
time = 617077
|
||||
flags = 0
|
||||
data = length 6097, hash 69DCD00C
|
||||
sample 39:
|
||||
time = 700466
|
||||
flags = 0
|
||||
data = length 187498, hash C9F64D34
|
||||
sample 40:
|
||||
time = 667111
|
||||
flags = 0
|
||||
data = length 8801, hash DADE42B2
|
||||
sample 41:
|
||||
time = 650433
|
||||
flags = 0
|
||||
data = length 5722, hash 58A3AB0E
|
||||
sample 42:
|
||||
time = 683788
|
||||
flags = 0
|
||||
data = length 4173, hash 7D6DA063
|
||||
sample 43:
|
||||
time = 767177
|
||||
flags = 0
|
||||
data = length 183855, hash 996A0D0B
|
||||
sample 44:
|
||||
time = 733822
|
||||
flags = 0
|
||||
data = length 7942, hash 4B02B7FC
|
||||
sample 45:
|
||||
time = 717144
|
||||
flags = 0
|
||||
data = length 5209, hash 692EE1FC
|
||||
sample 46:
|
||||
time = 750500
|
||||
flags = 0
|
||||
data = length 4518, hash 9B71E0F1
|
||||
sample 47:
|
||||
time = 900600
|
||||
flags = 0
|
||||
data = length 171861, hash B873F987
|
||||
sample 48:
|
||||
time = 833888
|
||||
flags = 0
|
||||
data = length 21001, hash 5B0D727A
|
||||
sample 49:
|
||||
time = 800533
|
||||
flags = 0
|
||||
data = length 9532, hash 6932E709
|
||||
sample 50:
|
||||
time = 783855
|
||||
flags = 0
|
||||
data = length 4211, hash F13B567D
|
||||
sample 51:
|
||||
time = 817211
|
||||
flags = 0
|
||||
data = length 4920, hash E21E3458
|
||||
sample 52:
|
||||
time = 867244
|
||||
flags = 0
|
||||
data = length 9167, hash F2EC1662
|
||||
sample 53:
|
||||
time = 850566
|
||||
flags = 0
|
||||
data = length 4212, hash 5976451D
|
||||
sample 54:
|
||||
time = 883922
|
||||
flags = 0
|
||||
data = length 4286, hash 1B2B6FB5
|
||||
sample 55:
|
||||
time = 1034022
|
||||
flags = 0
|
||||
data = length 144185, hash 97A28C82
|
||||
sample 56:
|
||||
time = 967311
|
||||
flags = 0
|
||||
data = length 20741, hash 6374F2D6
|
||||
sample 57:
|
||||
time = 933955
|
||||
flags = 0
|
||||
data = length 8603, hash 188497E7
|
||||
sample 58:
|
||||
time = 917277
|
||||
flags = 0
|
||||
data = length 3727, hash 8385995D
|
||||
sample 59:
|
||||
time = 950633
|
||||
flags = 0
|
||||
data = length 4415, hash 84E1074
|
||||
sample 60:
|
||||
time = 1000666
|
||||
flags = 0
|
||||
data = length 9101, hash DB81A03
|
||||
sample 61:
|
||||
time = 983988
|
||||
flags = 0
|
||||
data = length 4531, hash 605DDD0A
|
||||
sample 62:
|
||||
time = 1017344
|
||||
flags = 0
|
||||
data = length 4201, hash 3919361A
|
||||
sample 63:
|
||||
time = 1134088
|
||||
flags = 0
|
||||
data = length 100876, hash 1BD95B61
|
||||
sample 64:
|
||||
time = 1084055
|
||||
flags = 0
|
||||
data = length 15681, hash FC769391
|
||||
sample 65:
|
||||
time = 1067377
|
||||
flags = 0
|
||||
data = length 6817, hash 8CF14B05
|
||||
sample 66:
|
||||
time = 1050700
|
||||
flags = 0
|
||||
data = length 3927, hash 5BE4D2FC
|
||||
sample 67:
|
||||
time = 1117411
|
||||
flags = 0
|
||||
data = length 5589, hash 1A76E43B
|
||||
sample 68:
|
||||
time = 1100733
|
||||
flags = 0
|
||||
data = length 4350, hash 98211199
|
||||
sample 69:
|
||||
time = 1217477
|
||||
flags = 0
|
||||
data = length 51089, hash 35EC3C41
|
||||
sample 70:
|
||||
time = 1184122
|
||||
flags = 0
|
||||
data = length 14567, hash B15DBDBC
|
||||
sample 71:
|
||||
time = 1167444
|
||||
flags = 0
|
||||
data = length 7552, hash AE195424
|
||||
sample 72:
|
||||
time = 1150766
|
||||
flags = 0
|
||||
data = length 4193, hash 35AB5623
|
||||
sample 73:
|
||||
time = 1200800
|
||||
flags = 0
|
||||
data = length 5423, hash 24FFCED
|
||||
sample 74:
|
||||
time = 1267511
|
||||
flags = 0
|
||||
data = length 16168, hash D6C052C2
|
||||
sample 75:
|
||||
time = 1250833
|
||||
flags = 0
|
||||
data = length 9809, hash D833D9F8
|
||||
sample 76:
|
||||
time = 1234155
|
||||
flags = 0
|
||||
data = length 6413, hash 6E770E44
|
||||
tracksEnded = true
|
@ -14,8 +14,8 @@ track 0:
|
||||
averageBitrate = 2690171
|
||||
id = 1
|
||||
containerMimeType = video/mp4
|
||||
sampleMimeType = video/hevc
|
||||
codecs = hvc1.2.4.L93.B0
|
||||
sampleMimeType = video/dolby-vision
|
||||
codecs = dvhe.08.02
|
||||
maxInputSize = 30755
|
||||
maxNumReorderSamples = 2
|
||||
width = 1280
|
||||
@ -33,6 +33,7 @@ track 0:
|
||||
metadata = entries=[mdta: key=com.apple.quicktime.location.accuracy.horizontal, value=35.000000, mdta: key=com.apple.quicktime.location.ISO6709, value=+51.5334-000.1255+026.756/, mdta: key=com.apple.quicktime.software, value=16.4.1, mdta: key=com.apple.quicktime.creationdate, value=2023-05-09T12:41:46+0100, mdta: key=com.apple.quicktime.make, value=Apple, mdta: key=com.apple.quicktime.model, value=iPhone 14 Pro, Mp4Timestamp: creation time=3000000000, modification time=4000000000, timescale=10000]
|
||||
initializationData:
|
||||
data = length 97, hash 71D67547
|
||||
data = length 24, hash D98F4125
|
||||
sample 0:
|
||||
time = 0
|
||||
flags = 1
|
||||
|
@ -556,12 +556,8 @@ public class TransformerEndToEndTest {
|
||||
.build()
|
||||
.run(testId, editedMediaItem);
|
||||
|
||||
// Rarely, MediaCodec decoders output frames in the wrong order.
|
||||
// When the MediaCodec encoder sees frames in the wrong order, fewer output frames are produced.
|
||||
// Use a tolerance when comparing frame counts. See b/343476417#comment5.
|
||||
assertThat(result.exportResult.videoFrameCount)
|
||||
.isWithin(2)
|
||||
.of(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFrameCount);
|
||||
.isEqualTo(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFrameCount);
|
||||
assertThat(new File(result.filePath).length()).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@ -587,12 +583,8 @@ public class TransformerEndToEndTest {
|
||||
.build()
|
||||
.run(testId, editedMediaItem);
|
||||
|
||||
// Rarely, MediaCodec decoders output frames in the wrong order.
|
||||
// When the MediaCodec encoder sees frames in the wrong order, fewer output frames are produced.
|
||||
// Use a tolerance when comparing frame counts. See b/343476417#comment5.
|
||||
assertThat(result.exportResult.videoFrameCount)
|
||||
.isWithin(2)
|
||||
.of(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFrameCount);
|
||||
.isEqualTo(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_320W_240H_15S.videoFrameCount);
|
||||
assertThat(new File(result.filePath).length()).isGreaterThan(0);
|
||||
}
|
||||
|
||||
@ -1837,7 +1829,7 @@ public class TransformerEndToEndTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dolbyVisionVideo_noEffects_withInAppMuxer_transmuxesToHevc() throws Exception {
|
||||
public void dolbyVisionVideo_noEffects_withInAppMuxer_transmuxesSuccessfully() throws Exception {
|
||||
EditedMediaItem editedMediaItem =
|
||||
new EditedMediaItem.Builder(MediaItem.fromUri(Uri.parse(MP4_ASSET_DOLBY_VISION_HDR.uri)))
|
||||
.setRemoveAudio(true)
|
||||
@ -1855,9 +1847,13 @@ public class TransformerEndToEndTest {
|
||||
|
||||
MediaExtractorCompat mediaExtractor = new MediaExtractorCompat(context);
|
||||
mediaExtractor.setDataSource(Uri.parse(result.filePath), /* offset= */ 0);
|
||||
checkState(mediaExtractor.getTrackCount() == 1);
|
||||
checkState(mediaExtractor.getTrackCount() == 2);
|
||||
MediaFormat mediaFormat = mediaExtractor.getTrackFormat(/* trackIndex= */ 0);
|
||||
Format format = createFormatFromMediaFormat(mediaFormat);
|
||||
assertThat(format.sampleMimeType).isEqualTo(MimeTypes.VIDEO_DOLBY_VISION);
|
||||
// HEVC track is compatibility track of dolby vision codec.
|
||||
mediaFormat = mediaExtractor.getTrackFormat(/* trackIndex= */ 1);
|
||||
format = createFormatFromMediaFormat(mediaFormat);
|
||||
assertThat(format.sampleMimeType).isEqualTo(MimeTypes.VIDEO_H265);
|
||||
assertThat(result.exportResult.videoConversionProcess).isEqualTo(CONVERSION_PROCESS_TRANSMUXED);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user