diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java index 0ae0fb2f39..da080e66b6 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/ts/H265Reader.java @@ -417,7 +417,7 @@ public final class H265Reader implements ElementaryStreamReader { /** * Reads the number of short term reference picture sets in a SPS as ue(v), then skips all of - * them. See H.265/HEVC (2014) 7.3.7. + * them. See H.265/HEVC (2014) 7.3.7 and 7.4.8. */ private static void skipShortTermRefPicSets(ParsableNalUnitBitArray bitArray) { int numShortTermRefPicSets = bitArray.readUnsignedExpGolombCodedInt(); @@ -433,21 +433,27 @@ public final class H265Reader implements ElementaryStreamReader { interRefPicSetPredictionFlag = bitArray.readBit(); } if (interRefPicSetPredictionFlag) { - bitArray.skipBit(); // delta_rps_sign + boolean deltaRpsSign = bitArray.readBit(); // delta_rps_sign bitArray.readUnsignedExpGolombCodedInt(); // abs_delta_rps_minus1 - int numDeltaPocs = 0; + numNegativePics = 0; + numPositivePics = 0; for (int j = 0; j <= previousNumDeltaPocs; j++) { if (!bitArray.readBit()) { // used_by_curr_pic_flag[j] - if(!bitArray.readBit()) // use_delta_flag[j] - continue; // if not use_delta_flag, skip increase numDeltaPocs + if (bitArray.readBit()) { // use_delta_flag[j] + if (deltaRpsSign) { + // See H.265/HEVC (2014) section 7.4.8 equation 7-61 + numNegativePics++; + } else { + // See H.265/HEVC (2014) section 7.4.8 equation 7-62 + numPositivePics++; + } + } } - numDeltaPocs++; } - previousNumDeltaPocs = numDeltaPocs; + } else { numNegativePics = bitArray.readUnsignedExpGolombCodedInt(); numPositivePics = bitArray.readUnsignedExpGolombCodedInt(); - previousNumDeltaPocs = numNegativePics + numPositivePics; for (int i = 0; i < numNegativePics; i++) { bitArray.readUnsignedExpGolombCodedInt(); // delta_poc_s0_minus1[i] bitArray.skipBit(); // used_by_curr_pic_s0_flag[i] @@ -457,6 +463,8 @@ public final class H265Reader implements ElementaryStreamReader { bitArray.skipBit(); // used_by_curr_pic_s1_flag[i] } } + // See H.265/HEVC (2014) section 7.4.8 equation 7-71 + previousNumDeltaPocs = numNegativePics + numPositivePics; } } diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump index d4dc0a7863..28d2c8b598 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.0.dump @@ -15,7 +15,6 @@ track 256: codecs = hvc1.1.6.L63.90 width = 914 height = 686 - pixelWidthHeightRatio = 1.0003651 initializationData: data = length 146, hash 61554FEF sample 0: diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump index cfe07b53a9..1ed39225ea 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.1.dump @@ -15,7 +15,6 @@ track 256: codecs = hvc1.1.6.L63.90 width = 914 height = 686 - pixelWidthHeightRatio = 1.0003651 initializationData: data = length 146, hash 61554FEF sample 0: diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump index c3e8198155..7282d331b2 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.2.dump @@ -15,7 +15,6 @@ track 256: codecs = hvc1.1.6.L63.90 width = 914 height = 686 - pixelWidthHeightRatio = 1.0003651 initializationData: data = length 146, hash 61554FEF sample 0: diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump index d10958f482..bae2186af9 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.3.dump @@ -15,7 +15,6 @@ track 256: codecs = hvc1.1.6.L63.90 width = 914 height = 686 - pixelWidthHeightRatio = 1.0003651 initializationData: data = length 146, hash 61554FEF sample 0: diff --git a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump index 85ddd41279..cfa6959fd8 100644 --- a/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/ts/sample_h265_rps_pred.ts.unknown_length.dump @@ -12,7 +12,6 @@ track 256: codecs = hvc1.1.6.L63.90 width = 914 height = 686 - pixelWidthHeightRatio = 1.0003651 initializationData: data = length 146, hash 61554FEF sample 0: