Sample metadata in the png extractor

PiperOrigin-RevId: 561049410
This commit is contained in:
tofunmi 2023-08-29 09:14:48 -07:00 committed by Copybara-Service
parent 32e367fabf
commit bb214b19f9
3 changed files with 26 additions and 6 deletions

View File

@ -15,6 +15,7 @@
*/ */
package androidx.media3.extractor.png; package androidx.media3.extractor.png;
import static androidx.media3.common.C.BUFFER_FLAG_KEY_FRAME;
import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.extractor.ImageExtractorUtil.IMAGE_TRACK_ID; import static androidx.media3.extractor.ImageExtractorUtil.IMAGE_TRACK_ID;
import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.ElementType.TYPE_USE;
@ -37,6 +38,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.RequiresNonNull;
/** Extracts data from the PNG container format. */ /** Extracts data from the PNG container format. */
@UnstableApi @UnstableApi
@ -61,6 +63,7 @@ public final class PngExtractor implements Extractor {
private final ParsableByteArray scratch; private final ParsableByteArray scratch;
private int size;
private @State int state; private @State int state;
private @MonotonicNonNull ExtractorOutput extractorOutput; private @MonotonicNonNull ExtractorOutput extractorOutput;
@ -102,13 +105,20 @@ public final class PngExtractor implements Extractor {
int result = trackOutput.sampleData(input, FIXED_READ_LENGTH, /* allowEndOfInput= */ true); int result = trackOutput.sampleData(input, FIXED_READ_LENGTH, /* allowEndOfInput= */ true);
if (result == C.RESULT_END_OF_INPUT) { if (result == C.RESULT_END_OF_INPUT) {
state = STATE_ENDED; state = STATE_ENDED;
@C.BufferFlags int flags = BUFFER_FLAG_KEY_FRAME;
trackOutput.sampleMetadata(
/* timeUs= */ 0, flags, size, /* offset= */ 0, /* cryptoData= */ null);
size = 0;
} else {
size += result;
} }
} }
@RequiresNonNull("this.extractorOutput")
private void outputImageTrackAndSeekMap() { private void outputImageTrackAndSeekMap() {
ExtractorOutput extractorOutput = checkNotNull(this.extractorOutput); TrackOutput trackOutput =
TrackOutput imageTrackOutput = extractorOutput.track(IMAGE_TRACK_ID, C.TRACK_TYPE_IMAGE); checkNotNull(extractorOutput).track(IMAGE_TRACK_ID, C.TRACK_TYPE_IMAGE);
imageTrackOutput.format( trackOutput.format(
new Format.Builder() new Format.Builder()
.setContainerMimeType(MimeTypes.IMAGE_PNG) .setContainerMimeType(MimeTypes.IMAGE_PNG)
.setTileCountHorizontal(1) .setTileCountHorizontal(1)
@ -124,11 +134,13 @@ public final class PngExtractor implements Extractor {
if (position == 0) { if (position == 0) {
state = STATE_READING_IMAGE; state = STATE_READING_IMAGE;
} }
if (state == STATE_READING_IMAGE) {
size = 0;
}
} }
@Override @Override
public void release() { public void release() {
// Do nothing. // Do nothing.
} }
} }

View File

@ -6,7 +6,11 @@ seekMap:
numberOfTracks = 1 numberOfTracks = 1
track 1024: track 1024:
total output bytes = 29063 total output bytes = 29063
sample count = 0 sample count = 1
format 0: format 0:
containerMimeType = image/png containerMimeType = image/png
sample 0:
time = 0
flags = 1
data = length 29063, hash 4AC2C4FC
tracksEnded = true tracksEnded = true

View File

@ -6,7 +6,11 @@ seekMap:
numberOfTracks = 1 numberOfTracks = 1
track 1024: track 1024:
total output bytes = 29063 total output bytes = 29063
sample count = 0 sample count = 1
format 0: format 0:
containerMimeType = image/png containerMimeType = image/png
sample 0:
time = 0
flags = 1
data = length 29063, hash 4AC2C4FC
tracksEnded = true tracksEnded = true