Search in sources :

Example 1 with MotionPhotoMetadata

use of com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata in project ExoPlayer by google.

the class MotionPhotoDescriptionTest method getMotionPhotoMetadata_withPrimaryAndMultipleSecondaryMediaItems_returnsSecondMediaItemAsVideo.

@Test
public void getMotionPhotoMetadata_withPrimaryAndMultipleSecondaryMediaItems_returnsSecondMediaItemAsVideo() {
    MotionPhotoDescription motionPhotoDescription = new MotionPhotoDescription(TEST_PRESENTATION_TIMESTAMP_US, ImmutableList.of(new MotionPhotoDescription.ContainerItem(MimeTypes.IMAGE_JPEG, "Primary", /* length= */
    0, TEST_MOTION_PHOTO_PHOTO_PADDING_BYTES), new MotionPhotoDescription.ContainerItem(MimeTypes.VIDEO_MP4, "MotionPhoto", TEST_MOTION_PHOTO_VIDEO_LENGTH_BYTES, /* padding= */
    0), new MotionPhotoDescription.ContainerItem(MimeTypes.VIDEO_MP4, "MotionPhoto", TEST_MOTION_PHOTO_VIDEO_LENGTH_BYTES, /* padding= */
    0)));
    @Nullable MotionPhotoMetadata metadata = motionPhotoDescription.getMotionPhotoMetadata(TEST_MOTION_PHOTO_LENGTH_BYTES);
    assertThat(metadata.photoStartPosition).isEqualTo(0);
    assertThat(metadata.photoSize).isEqualTo(TEST_MOTION_PHOTO_LENGTH_BYTES - TEST_MOTION_PHOTO_VIDEO_LENGTH_BYTES * 2 - TEST_MOTION_PHOTO_PHOTO_PADDING_BYTES);
    assertThat(metadata.photoPresentationTimestampUs).isEqualTo(TEST_PRESENTATION_TIMESTAMP_US);
    assertThat(metadata.videoStartPosition).isEqualTo(TEST_MOTION_PHOTO_LENGTH_BYTES - TEST_MOTION_PHOTO_VIDEO_LENGTH_BYTES * 2);
    assertThat(metadata.videoSize).isEqualTo(TEST_MOTION_PHOTO_VIDEO_LENGTH_BYTES);
}
Also used : MotionPhotoMetadata(com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata) Nullable(androidx.annotation.Nullable) Test(org.junit.Test)

Example 2 with MotionPhotoMetadata

use of com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata in project ExoPlayer by google.

the class MotionPhotoDescriptionTest method getMotionPhotoMetadata_withPrimaryAndSecondaryMediaItems.

@Test
public void getMotionPhotoMetadata_withPrimaryAndSecondaryMediaItems() {
    MotionPhotoDescription motionPhotoDescription = new MotionPhotoDescription(TEST_PRESENTATION_TIMESTAMP_US, ImmutableList.of(new MotionPhotoDescription.ContainerItem(MimeTypes.IMAGE_JPEG, "Primary", /* length= */
    0, TEST_MOTION_PHOTO_PHOTO_PADDING_BYTES), new MotionPhotoDescription.ContainerItem(MimeTypes.VIDEO_MP4, "MotionPhoto", TEST_MOTION_PHOTO_VIDEO_LENGTH_BYTES, /* padding= */
    0)));
    @Nullable MotionPhotoMetadata metadata = motionPhotoDescription.getMotionPhotoMetadata(TEST_MOTION_PHOTO_LENGTH_BYTES);
    assertThat(metadata.photoStartPosition).isEqualTo(0);
    assertThat(metadata.photoSize).isEqualTo(TEST_MOTION_PHOTO_LENGTH_BYTES - TEST_MOTION_PHOTO_VIDEO_LENGTH_BYTES - TEST_MOTION_PHOTO_PHOTO_PADDING_BYTES);
    assertThat(metadata.photoPresentationTimestampUs).isEqualTo(TEST_PRESENTATION_TIMESTAMP_US);
    assertThat(metadata.videoStartPosition).isEqualTo(TEST_MOTION_PHOTO_LENGTH_BYTES - TEST_MOTION_PHOTO_VIDEO_LENGTH_BYTES);
    assertThat(metadata.videoSize).isEqualTo(TEST_MOTION_PHOTO_VIDEO_LENGTH_BYTES);
}
Also used : MotionPhotoMetadata(com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata) Nullable(androidx.annotation.Nullable) Test(org.junit.Test)

Example 3 with MotionPhotoMetadata

use of com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata in project ExoPlayer by google.

the class MotionPhotoDescriptionTest method getMotionPhotoMetadata_withOnlyPrimaryItem_returnsNull.

@Test
public void getMotionPhotoMetadata_withOnlyPrimaryItem_returnsNull() {
    MotionPhotoDescription motionPhotoDescription = new MotionPhotoDescription(TEST_PRESENTATION_TIMESTAMP_US, ImmutableList.of(new MotionPhotoDescription.ContainerItem(MimeTypes.VIDEO_MP4, "Primary", /* length= */
    0, TEST_MOTION_PHOTO_PHOTO_PADDING_BYTES)));
    @Nullable MotionPhotoMetadata metadata = motionPhotoDescription.getMotionPhotoMetadata(TEST_MOTION_PHOTO_LENGTH_BYTES);
    assertThat(metadata).isNull();
}
Also used : MotionPhotoMetadata(com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata) Nullable(androidx.annotation.Nullable) Test(org.junit.Test)

Example 4 with MotionPhotoMetadata

use of com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata in project ExoPlayer by google.

the class JpegExtractor method readSegment.

private void readSegment(ExtractorInput input) throws IOException {
    if (marker == MARKER_APP1) {
        ParsableByteArray payload = new ParsableByteArray(segmentLength);
        input.readFully(payload.getData(), /* offset= */
        0, /* length= */
        segmentLength);
        if (motionPhotoMetadata == null && HEADER_XMP_APP1.equals(payload.readNullTerminatedString())) {
            @Nullable String xmpString = payload.readNullTerminatedString();
            if (xmpString != null) {
                motionPhotoMetadata = getMotionPhotoMetadata(xmpString, input.getLength());
                if (motionPhotoMetadata != null) {
                    mp4StartPosition = motionPhotoMetadata.videoStartPosition;
                }
            }
        }
    } else {
        input.skipFully(segmentLength);
    }
    state = STATE_READING_MARKER;
}
Also used : ParsableByteArray(com.google.android.exoplayer2.util.ParsableByteArray) Nullable(androidx.annotation.Nullable)

Example 5 with MotionPhotoMetadata

use of com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata in project ExoPlayer by google.

the class MotionPhotoDescriptionTest method getMotionPhotoMetadata_withPrimaryAndSecondaryItemSharingData_returnsPrimaryItemAsPhotoAndVideo.

@Test
public void getMotionPhotoMetadata_withPrimaryAndSecondaryItemSharingData_returnsPrimaryItemAsPhotoAndVideo() {
    // Theoretical example of an HEIF file that has both an image and a video represented in the
    // same file, which looks like an MP4.
    MotionPhotoDescription motionPhotoDescription = new MotionPhotoDescription(TEST_PRESENTATION_TIMESTAMP_US, ImmutableList.of(new MotionPhotoDescription.ContainerItem(MimeTypes.VIDEO_MP4, "Primary", /* length= */
    0, TEST_MOTION_PHOTO_PHOTO_PADDING_BYTES), new MotionPhotoDescription.ContainerItem(MimeTypes.VIDEO_MP4, "MotionPhoto", /* length= */
    0, /* padding= */
    0)));
    @Nullable MotionPhotoMetadata metadata = motionPhotoDescription.getMotionPhotoMetadata(TEST_MOTION_PHOTO_LENGTH_BYTES);
    assertThat(metadata.photoStartPosition).isEqualTo(0);
    assertThat(metadata.photoSize).isEqualTo(TEST_MOTION_PHOTO_LENGTH_BYTES - TEST_MOTION_PHOTO_PHOTO_PADDING_BYTES);
    assertThat(metadata.photoPresentationTimestampUs).isEqualTo(TEST_PRESENTATION_TIMESTAMP_US);
    assertThat(metadata.videoStartPosition).isEqualTo(0);
    assertThat(metadata.videoSize).isEqualTo(TEST_MOTION_PHOTO_LENGTH_BYTES - TEST_MOTION_PHOTO_PHOTO_PADDING_BYTES);
}
Also used : MotionPhotoMetadata(com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata) Nullable(androidx.annotation.Nullable) Test(org.junit.Test)

Aggregations

Nullable (androidx.annotation.Nullable)6 MotionPhotoMetadata (com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata)6 Test (org.junit.Test)5 Format (com.google.android.exoplayer2.Format)1 ExtractorOutput (com.google.android.exoplayer2.extractor.ExtractorOutput)1 SeekMap (com.google.android.exoplayer2.extractor.SeekMap)1 TrackOutput (com.google.android.exoplayer2.extractor.TrackOutput)1 Metadata (com.google.android.exoplayer2.metadata.Metadata)1 TrackGroupArray (com.google.android.exoplayer2.source.TrackGroupArray)1 ParsableByteArray (com.google.android.exoplayer2.util.ParsableByteArray)1