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:
Googler 2025-04-21 05:08:17 -07:00 committed by Copybara-Service
parent d0833c4e7c
commit dc9d023e85
18 changed files with 4005 additions and 21 deletions

View File

@ -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.
*

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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 =

View File

@ -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 =

View File

@ -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 =

View File

@ -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 =

View File

@ -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,

View File

@ -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,

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);
}