diff --git a/library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java b/library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java index 54f678bc1c..b547ad67f6 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadata.java @@ -19,6 +19,7 @@ package com.google.android.exoplayer2.metadata.mp4; import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.Nullable; +import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.metadata.Metadata; import com.google.common.primitives.Longs; @@ -29,6 +30,10 @@ public final class MotionPhotoMetadata implements Metadata.Entry { public final long photoStartPosition; /** The size of the photo data, in bytes. */ public final long photoSize; + /** + * The presentation timestamp of the photo, in microseconds, or {@link C#TIME_UNSET} if unknown. + */ + public final long photoPresentationTimestampUs; /** The start offset of the video data, in bytes. */ public final long videoStartPosition; /** The size of the video data, in bytes. */ @@ -36,9 +41,14 @@ public final class MotionPhotoMetadata implements Metadata.Entry { /** Creates an instance. */ public MotionPhotoMetadata( - long photoStartPosition, long photoSize, long videoStartPosition, long videoSize) { + long photoStartPosition, + long photoSize, + long photoPresentationTimestampUs, + long videoStartPosition, + long videoSize) { this.photoStartPosition = photoStartPosition; this.photoSize = photoSize; + this.photoPresentationTimestampUs = photoPresentationTimestampUs; this.videoStartPosition = videoStartPosition; this.videoSize = videoSize; } @@ -46,6 +56,7 @@ public final class MotionPhotoMetadata implements Metadata.Entry { private MotionPhotoMetadata(Parcel in) { photoStartPosition = in.readLong(); photoSize = in.readLong(); + photoPresentationTimestampUs = in.readLong(); videoStartPosition = in.readLong(); videoSize = in.readLong(); } @@ -61,6 +72,7 @@ public final class MotionPhotoMetadata implements Metadata.Entry { MotionPhotoMetadata other = (MotionPhotoMetadata) obj; return photoStartPosition == other.photoStartPosition && photoSize == other.photoSize + && photoPresentationTimestampUs == other.photoPresentationTimestampUs && videoStartPosition == other.videoStartPosition && videoSize == other.videoSize; } @@ -70,6 +82,7 @@ public final class MotionPhotoMetadata implements Metadata.Entry { int result = 17; result = 31 * result + Longs.hashCode(photoStartPosition); result = 31 * result + Longs.hashCode(photoSize); + result = 31 * result + Longs.hashCode(photoPresentationTimestampUs); result = 31 * result + Longs.hashCode(videoStartPosition); result = 31 * result + Longs.hashCode(videoSize); return result; @@ -81,6 +94,8 @@ public final class MotionPhotoMetadata implements Metadata.Entry { + photoStartPosition + ", photoSize=" + photoSize + + ", photoPresentationTimestampUs=" + + photoPresentationTimestampUs + ", videoStartPosition=" + videoStartPosition + ", videoSize=" @@ -93,6 +108,7 @@ public final class MotionPhotoMetadata implements Metadata.Entry { public void writeToParcel(Parcel dest, int flags) { dest.writeLong(photoStartPosition); dest.writeLong(photoSize); + dest.writeLong(photoPresentationTimestampUs); dest.writeLong(videoStartPosition); dest.writeLong(videoSize); } diff --git a/library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java b/library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java index 600aa1d9cb..81c3669676 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/metadata/mp4/MotionPhotoMetadataTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import android.os.Parcel; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; import org.junit.Test; import org.junit.runner.RunWith; @@ -33,6 +34,7 @@ public class MotionPhotoMetadataTest { new MotionPhotoMetadata( /* photoStartPosition= */ 0, /* photoSize= */ 10, + /* photoPresentationTimestampUs= */ C.TIME_UNSET, /* videoStartPosition= */ 15, /* videoSize= */ 35); diff --git a/library/core/src/test/java/com/google/android/exoplayer2/MetadataRetrieverTest.java b/library/core/src/test/java/com/google/android/exoplayer2/MetadataRetrieverTest.java index c54ee67535..53f6c24f10 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/MetadataRetrieverTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/MetadataRetrieverTest.java @@ -112,6 +112,7 @@ public class MetadataRetrieverTest { new MotionPhotoMetadata( /* photoStartPosition= */ 0, /* photoSize= */ 28_853, + /* photoPresentationTimestampUs= */ C.TIME_UNSET, /* videoStartPosition= */ 28_869, /* videoSize= */ 28_803); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java index b59729b58d..823fd77fe0 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java @@ -761,6 +761,7 @@ public final class Mp4Extractor implements Extractor, SeekMap { new MotionPhotoMetadata( /* photoStartPosition= */ 0, /* photoSize= */ atomStartPosition, + /* photoPresentationTimestampUs= */ C.TIME_UNSET, /* videoStartPosition= */ atomStartPosition + atomHeaderBytesRead, /* videoSize= */ atomSize - atomHeaderBytesRead); }