AV1 treat show_existing_frame headers as not depended on

PiperOrigin-RevId: 724300793
This commit is contained in:
dancho 2025-02-07 04:47:34 -08:00 committed by Copybara-Service
parent babc2dd416
commit 65e7b599d8
4 changed files with 57 additions and 73 deletions

View File

@ -294,10 +294,7 @@ public final class ObuParser {
throwWhenFeatureRequired(sequenceHeader.reducedStillPictureHeader); throwWhenFeatureRequired(sequenceHeader.reducedStillPictureHeader);
boolean showExistingFrame = obuData.readBit(); boolean showExistingFrame = obuData.readBit();
if (showExistingFrame) { if (showExistingFrame) {
// TODO: b/391108133 - Treat showExistingFrame as depended on. The picture was already isDependedOn = false;
// decoded and the player may not save a lot of resources by rendering. Check if this
// assumption is correct!
isDependedOn = true;
return; return;
} }
int frameType = obuData.readBits(2); int frameType = obuData.readBits(2);

View File

@ -102,7 +102,7 @@ public class ObuParserTest {
} }
@Test @Test
public void parseFrameHeader_fromFrameHeader_returnsIsDependedOn() { public void parseFrameHeader_fromShowExistingFrameHeader_returnsIsNotDependedOn() {
ObuParser.Obu sequenceHeaderObu = ObuParser.split(SEQUENCE_HEADER_AND_FRAME).get(0); ObuParser.Obu sequenceHeaderObu = ObuParser.split(SEQUENCE_HEADER_AND_FRAME).get(0);
ObuParser.SequenceHeader sequenceHeader = ObuParser.SequenceHeader.parse(sequenceHeaderObu); ObuParser.SequenceHeader sequenceHeader = ObuParser.SequenceHeader.parse(sequenceHeaderObu);
ObuParser.Obu frameHeaderObu = ObuParser.Obu frameHeaderObu =
@ -110,7 +110,7 @@ public class ObuParserTest {
ObuParser.FrameHeader frameHeader = ObuParser.FrameHeader.parse(sequenceHeader, frameHeaderObu); ObuParser.FrameHeader frameHeader = ObuParser.FrameHeader.parse(sequenceHeader, frameHeaderObu);
assertThat(frameHeader.isDependedOn()).isTrue(); assertThat(frameHeader.isDependedOn()).isFalse();
} }
@Test @Test

View File

@ -16,6 +16,7 @@
package androidx.media3.exoplayer.video; package androidx.media3.exoplayer.video;
import static androidx.media3.container.ObuParser.OBU_FRAME; import static androidx.media3.container.ObuParser.OBU_FRAME;
import static androidx.media3.container.ObuParser.OBU_FRAME_HEADER;
import static androidx.media3.container.ObuParser.OBU_PADDING; import static androidx.media3.container.ObuParser.OBU_PADDING;
import static androidx.media3.container.ObuParser.OBU_SEQUENCE_HEADER; import static androidx.media3.container.ObuParser.OBU_SEQUENCE_HEADER;
import static androidx.media3.container.ObuParser.OBU_TEMPORAL_DELIMITER; import static androidx.media3.container.ObuParser.OBU_TEMPORAL_DELIMITER;
@ -63,7 +64,7 @@ import java.util.List;
int skippedFramesCount = 0; int skippedFramesCount = 0;
int last = obuList.size() - 1; int last = obuList.size() - 1;
while (last >= 0 && canSkipObu(obuList.get(last))) { while (last >= 0 && canSkipObu(obuList.get(last))) {
if (obuList.get(last).type == OBU_FRAME) { if (obuList.get(last).type == OBU_FRAME || obuList.get(last).type == OBU_FRAME_HEADER) {
skippedFramesCount++; skippedFramesCount++;
} }
last--; last--;
@ -86,7 +87,7 @@ import java.util.List;
if (obu.type == OBU_TEMPORAL_DELIMITER || obu.type == OBU_PADDING) { if (obu.type == OBU_TEMPORAL_DELIMITER || obu.type == OBU_PADDING) {
return true; return true;
} }
if (obu.type == OBU_FRAME && sequenceHeader != null) { if ((obu.type == OBU_FRAME || obu.type == OBU_FRAME_HEADER) && sequenceHeader != null) {
FrameHeader frameHeader = FrameHeader.parse(sequenceHeader, obu); FrameHeader frameHeader = FrameHeader.parse(sequenceHeader, obu);
return frameHeader != null && !frameHeader.isDependedOn(); return frameHeader != null && !frameHeader.isDependedOn();
} }

View File

@ -1,198 +1,184 @@
MediaCodecAdapter (exotest.video.av1): MediaCodecAdapter (exotest.video.av1):
inputBuffers: inputBuffers:
count = 28 count = 26
input buffer #0: input buffer #0:
timeUs = 1000000000000 timeUs = 1000000000000
contents = length 84, hash 9C46A819 contents = length 84, hash 9C46A819
input buffer #1: input buffer #1:
timeUs = 1000000066666
contents = length 133, hash 1F0DB1A3
input buffer #2:
timeUs = 1000000133333
contents = length 3, hash D5F0
input buffer #3:
timeUs = 1000000200000 timeUs = 1000000200000
contents = length 31, hash 4D3984BD contents = length 161, hash 489E5DE0
input buffer #4: input buffer #2:
timeUs = 1000000233333 timeUs = 1000000233333
contents = length 27, hash 70CFAC05 contents = length 27, hash 70CFAC05
input buffer #5: input buffer #3:
timeUs = 1000000266666 timeUs = 1000000266666
contents = length 3, hash D5D0 contents = length 3, hash D5D0
input buffer #6: input buffer #4:
timeUs = 1000000300000 timeUs = 1000000300000
contents = length 82, hash 944218D6 contents = length 82, hash 944218D6
input buffer #7: input buffer #5:
timeUs = 1000000333333 timeUs = 1000000333333
contents = length 3, hash D600 contents = length 3, hash D600
input buffer #8: input buffer #6:
timeUs = 1000000366666 timeUs = 1000000366666
contents = length 27, hash BA4D4A06 contents = length 27, hash BA4D4A06
input buffer #9: input buffer #7:
timeUs = 1000000400000 timeUs = 1000000400000
contents = length 3, hash D5F0 contents = length 3, hash D5F0
input buffer #10: input buffer #8:
timeUs = 1000000433333 timeUs = 1000000433333
contents = length 54, hash A98584CA contents = length 54, hash A98584CA
input buffer #11: input buffer #9:
timeUs = 1000000466666 timeUs = 1000000466666
contents = length 3, hash D600 contents = length 3, hash D600
input buffer #12: input buffer #10:
timeUs = 1000000500000 timeUs = 1000000500000
contents = length 27, hash 45D733B8 contents = length 27, hash 45D733B8
input buffer #13: input buffer #11:
timeUs = 1000000533333 timeUs = 1000000533333
contents = length 3, hash D5A0 contents = length 3, hash D5A0
input buffer #14: input buffer #12:
timeUs = 1000000566666 timeUs = 1000000566666
contents = length 112, hash B80B26FD contents = length 112, hash B80B26FD
input buffer #15: input buffer #13:
timeUs = 1000000600000 timeUs = 1000000600000
contents = length 3, hash D5F0 contents = length 3, hash D5F0
input buffer #16: input buffer #14:
timeUs = 1000000633333 timeUs = 1000000633333
contents = length 27, hash 37DD29D9 contents = length 27, hash 37DD29D9
input buffer #17: input buffer #15:
timeUs = 1000000666666 timeUs = 1000000666666
contents = length 3, hash D5E0 contents = length 3, hash D5E0
input buffer #18: input buffer #16:
timeUs = 1000000700000 timeUs = 1000000700000
contents = length 54, hash 1C15581C contents = length 54, hash 1C15581C
input buffer #19: input buffer #17:
timeUs = 1000000733333 timeUs = 1000000733333
contents = length 3, hash D5F0 contents = length 3, hash D5F0
input buffer #20: input buffer #18:
timeUs = 1000000766666 timeUs = 1000000766666
contents = length 27, hash 49EC3531 contents = length 27, hash 49EC3531
input buffer #21: input buffer #19:
timeUs = 1000000800000 timeUs = 1000000800000
contents = length 3, hash D5B0 contents = length 3, hash D5B0
input buffer #22: input buffer #20:
timeUs = 1000000833333 timeUs = 1000000833333
contents = length 84, hash 2025C9F5 contents = length 84, hash 2025C9F5
input buffer #23: input buffer #21:
timeUs = 1000000866666 timeUs = 1000000866666
contents = length 3, hash D5D0 contents = length 3, hash D5D0
input buffer #24: input buffer #22:
timeUs = 1000000900000 timeUs = 1000000900000
contents = length 27, hash B927669C contents = length 27, hash B927669C
input buffer #25: input buffer #23:
timeUs = 1000000933333 timeUs = 1000000933333
contents = length 3, hash D5C0 contents = length 3, hash D5C0
input buffer #26: input buffer #24:
timeUs = 1000000966666 timeUs = 1000000966666
contents = length 27, hash 706C58AD contents = length 27, hash 706C58AD
input buffer #27: input buffer #25:
timeUs = 0 timeUs = 0
flags = 4 flags = 4
contents = length 0, hash 1 contents = length 0, hash 1
outputBuffers: outputBuffers:
count = 27 count = 25
output buffer #0: output buffer #0:
timeUs = 1000000000000 timeUs = 1000000000000
size = 84 size = 84
rendered = false rendered = false
output buffer #1: output buffer #1:
timeUs = 1000000066666
size = 133
rendered = false
output buffer #2:
timeUs = 1000000133333
size = 3
rendered = false
output buffer #3:
timeUs = 1000000200000 timeUs = 1000000200000
size = 31 size = 161
rendered = true rendered = true
output buffer #4: output buffer #2:
timeUs = 1000000233333 timeUs = 1000000233333
size = 27 size = 27
rendered = true rendered = true
output buffer #5: output buffer #3:
timeUs = 1000000266666 timeUs = 1000000266666
size = 3 size = 3
rendered = true rendered = true
output buffer #6: output buffer #4:
timeUs = 1000000300000 timeUs = 1000000300000
size = 82 size = 82
rendered = true rendered = true
output buffer #7: output buffer #5:
timeUs = 1000000333333 timeUs = 1000000333333
size = 3 size = 3
rendered = true rendered = true
output buffer #8: output buffer #6:
timeUs = 1000000366666 timeUs = 1000000366666
size = 27 size = 27
rendered = true rendered = true
output buffer #9: output buffer #7:
timeUs = 1000000400000 timeUs = 1000000400000
size = 3 size = 3
rendered = true rendered = true
output buffer #10: output buffer #8:
timeUs = 1000000433333 timeUs = 1000000433333
size = 54 size = 54
rendered = true rendered = true
output buffer #11: output buffer #9:
timeUs = 1000000466666 timeUs = 1000000466666
size = 3 size = 3
rendered = true rendered = true
output buffer #12: output buffer #10:
timeUs = 1000000500000 timeUs = 1000000500000
size = 27 size = 27
rendered = true rendered = true
output buffer #13: output buffer #11:
timeUs = 1000000533333 timeUs = 1000000533333
size = 3 size = 3
rendered = true rendered = true
output buffer #14: output buffer #12:
timeUs = 1000000566666 timeUs = 1000000566666
size = 112 size = 112
rendered = true rendered = true
output buffer #15: output buffer #13:
timeUs = 1000000600000 timeUs = 1000000600000
size = 3 size = 3
rendered = true rendered = true
output buffer #16: output buffer #14:
timeUs = 1000000633333 timeUs = 1000000633333
size = 27 size = 27
rendered = true rendered = true
output buffer #17: output buffer #15:
timeUs = 1000000666666 timeUs = 1000000666666
size = 3 size = 3
rendered = true rendered = true
output buffer #18: output buffer #16:
timeUs = 1000000700000 timeUs = 1000000700000
size = 54 size = 54
rendered = true rendered = true
output buffer #19: output buffer #17:
timeUs = 1000000733333 timeUs = 1000000733333
size = 3 size = 3
rendered = true rendered = true
output buffer #20: output buffer #18:
timeUs = 1000000766666 timeUs = 1000000766666
size = 27 size = 27
rendered = true rendered = true
output buffer #21: output buffer #19:
timeUs = 1000000800000 timeUs = 1000000800000
size = 3 size = 3
rendered = true rendered = true
output buffer #22: output buffer #20:
timeUs = 1000000833333 timeUs = 1000000833333
size = 84 size = 84
rendered = true rendered = true
output buffer #23: output buffer #21:
timeUs = 1000000866666 timeUs = 1000000866666
size = 3 size = 3
rendered = true rendered = true
output buffer #24: output buffer #22:
timeUs = 1000000900000 timeUs = 1000000900000
size = 27 size = 27
rendered = true rendered = true
output buffer #25: output buffer #23:
timeUs = 1000000933333 timeUs = 1000000933333
size = 3 size = 3
rendered = true rendered = true
output buffer #26: output buffer #24:
timeUs = 1000000966666 timeUs = 1000000966666
size = 27 size = 27
rendered = true rendered = true