Skip to content

Commit 153974e

Browse files
rohitjoinstonihei
authored andcommitted
Derive average bitrate from stsz sample size and mdhd duration
Compute a precise average bitrate using total sample size (from `stsz`) and media duration (from `mdhd`), overriding any existing bitrate read from `btrt` or `esds` boxes. PiperOrigin-RevId: 746497934 (cherry picked from commit 6f59827)
1 parent d7234a6 commit 153974e

File tree

444 files changed

+638
-61
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

444 files changed

+638
-61
lines changed

libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.google.common.base.Function;
5656
import com.google.common.collect.ImmutableList;
5757
import com.google.common.primitives.Ints;
58+
import java.math.RoundingMode;
5859
import java.nio.ByteBuffer;
5960
import java.nio.ByteOrder;
6061
import java.util.ArrayList;
@@ -527,6 +528,7 @@ public static TrackSampleTable parseStbl(
527528
int[] flags;
528529
long timestampTimeUnits = 0;
529530
long duration;
531+
long totalSize = 0;
530532

531533
if (rechunkFixedSizeSamples) {
532534
long[] chunkOffsetsBytes = new long[chunkIterator.length];
@@ -544,6 +546,7 @@ public static TrackSampleTable parseStbl(
544546
timestamps = rechunkedResults.timestamps;
545547
flags = rechunkedResults.flags;
546548
duration = rechunkedResults.duration;
549+
totalSize = rechunkedResults.totalSize;
547550
} else {
548551
offsets = new long[sampleCount];
549552
sizes = new int[sampleCount];
@@ -586,6 +589,7 @@ public static TrackSampleTable parseStbl(
586589

587590
offsets[i] = offset;
588591
sizes[i] = sampleSizeBox.readNextSampleSize();
592+
totalSize += sizes[i];
589593
if (sizes[i] > maximumSize) {
590594
maximumSize = sizes[i];
591595
}
@@ -657,6 +661,20 @@ public static TrackSampleTable parseStbl(
657661
+ (!isCttsValid ? ", ctts invalid" : ""));
658662
}
659663
}
664+
665+
if (track.mediaDurationUs > 0) {
666+
long averageBitrate =
667+
Util.scaleLargeValue(
668+
totalSize * C.BITS_PER_BYTE,
669+
C.MICROS_PER_SECOND,
670+
track.mediaDurationUs,
671+
RoundingMode.HALF_DOWN);
672+
if (averageBitrate > 0 && averageBitrate < Integer.MAX_VALUE) {
673+
Format format = track.format.buildUpon().setAverageBitrate((int) averageBitrate).build();
674+
track = track.copyWithFormat(format);
675+
}
676+
}
677+
660678
long durationUs = Util.scaleLargeTimestamp(duration, C.MICROS_PER_SECOND, track.timescale);
661679

662680
if (track.editListDurations == null) {

libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FixedSampleSizeRechunker.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,23 @@ public static final class Results {
3535
public final long[] timestamps;
3636
public final int[] flags;
3737
public final long duration;
38+
public final long totalSize;
3839

3940
private Results(
4041
long[] offsets,
4142
int[] sizes,
4243
int maximumSize,
4344
long[] timestamps,
4445
int[] flags,
45-
long duration) {
46+
long duration,
47+
long totalSize) {
4648
this.offsets = offsets;
4749
this.sizes = sizes;
4850
this.maximumSize = maximumSize;
4951
this.timestamps = timestamps;
5052
this.flags = flags;
5153
this.duration = duration;
54+
this.totalSize = totalSize;
5255
}
5356
}
5457

@@ -81,6 +84,7 @@ public static Results rechunk(
8184
int maximumSize = 0;
8285
long[] timestamps = new long[rechunkedSampleCount];
8386
int[] flags = new int[rechunkedSampleCount];
87+
int totalSize = 0;
8488

8589
int originalSampleIndex = 0;
8690
int newSampleIndex = 0;
@@ -93,6 +97,7 @@ public static Results rechunk(
9397

9498
offsets[newSampleIndex] = sampleOffset;
9599
sizes[newSampleIndex] = fixedSampleSize * bufferSampleCount;
100+
totalSize += sizes[newSampleIndex];
96101
maximumSize = max(maximumSize, sizes[newSampleIndex]);
97102
timestamps[newSampleIndex] = (timestampDeltaInTimeUnits * originalSampleIndex);
98103
flags[newSampleIndex] = C.BUFFER_FLAG_KEY_FRAME;
@@ -106,7 +111,7 @@ public static Results rechunk(
106111
}
107112
long duration = timestampDeltaInTimeUnits * originalSampleIndex;
108113

109-
return new Results(offsets, sizes, maximumSize, timestamps, flags, duration);
114+
return new Results(offsets, sizes, maximumSize, timestamps, flags, duration, totalSize);
110115
}
111116

112117
private FixedSampleSizeRechunker() {

libraries/test_data/src/test/assets/extractordumps/jpeg/pixel-motion-photo-2-hevc-tracks.jpg.0.dump

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 58
1212
track duration = 2100700
1313
format 0:
14+
averageBitrate = 12593505
1415
id = 1
1516
containerMimeType = video/mp4
1617
sampleMimeType = video/hevc
@@ -269,6 +270,7 @@ track 1:
269270
sample count = 1
270271
track duration = 466800
271272
format 0:
273+
averageBitrate = 2593047
272274
id = 2
273275
containerMimeType = video/mp4
274276
sampleMimeType = video/hevc
@@ -299,6 +301,7 @@ track 2:
299301
sample count = 58
300302
track duration = 2100700
301303
format 0:
304+
averageBitrate = 99395
302305
id = 3
303306
containerMimeType = video/mp4
304307
sampleMimeType = application/microvideo-meta-stream
@@ -541,6 +544,7 @@ track 3:
541544
sample count = 1
542545
track duration = 1133700
543546
format 0:
547+
averageBitrate = 416
544548
id = 4
545549
containerMimeType = video/mp4
546550
sampleMimeType = application/motionphoto-image-meta

libraries/test_data/src/test/assets/extractordumps/jpeg/pixel-motion-photo-2-hevc-tracks.jpg.1.dump

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 44
1212
track duration = 2100700
1313
format 0:
14+
averageBitrate = 12593505
1415
id = 1
1516
containerMimeType = video/mp4
1617
sampleMimeType = video/hevc
@@ -213,6 +214,7 @@ track 1:
213214
sample count = 1
214215
track duration = 466800
215216
format 0:
217+
averageBitrate = 2593047
216218
id = 2
217219
containerMimeType = video/mp4
218220
sampleMimeType = video/hevc
@@ -243,6 +245,7 @@ track 2:
243245
sample count = 38
244246
track duration = 2100700
245247
format 0:
248+
averageBitrate = 99395
246249
id = 3
247250
containerMimeType = video/mp4
248251
sampleMimeType = application/microvideo-meta-stream
@@ -405,6 +408,7 @@ track 3:
405408
sample count = 1
406409
track duration = 1133700
407410
format 0:
411+
averageBitrate = 416
408412
id = 4
409413
containerMimeType = video/mp4
410414
sampleMimeType = application/motionphoto-image-meta

libraries/test_data/src/test/assets/extractordumps/jpeg/pixel-motion-photo-2-hevc-tracks.jpg.2.dump

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 23
1212
track duration = 2100700
1313
format 0:
14+
averageBitrate = 12593505
1415
id = 1
1516
containerMimeType = video/mp4
1617
sampleMimeType = video/hevc
@@ -129,6 +130,7 @@ track 1:
129130
sample count = 1
130131
track duration = 466800
131132
format 0:
133+
averageBitrate = 2593047
132134
id = 2
133135
containerMimeType = video/mp4
134136
sampleMimeType = video/hevc
@@ -159,6 +161,7 @@ track 2:
159161
sample count = 17
160162
track duration = 2100700
161163
format 0:
164+
averageBitrate = 99395
162165
id = 3
163166
containerMimeType = video/mp4
164167
sampleMimeType = application/microvideo-meta-stream
@@ -237,6 +240,7 @@ track 3:
237240
sample count = 1
238241
track duration = 1133700
239242
format 0:
243+
averageBitrate = 416
240244
id = 4
241245
containerMimeType = video/mp4
242246
sampleMimeType = application/motionphoto-image-meta

libraries/test_data/src/test/assets/extractordumps/jpeg/pixel-motion-photo-2-hevc-tracks.jpg.3.dump

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 2
1212
track duration = 2100700
1313
format 0:
14+
averageBitrate = 12593505
1415
id = 1
1516
containerMimeType = video/mp4
1617
sampleMimeType = video/hevc
@@ -45,6 +46,7 @@ track 1:
4546
sample count = 1
4647
track duration = 466800
4748
format 0:
49+
averageBitrate = 2593047
4850
id = 2
4951
containerMimeType = video/mp4
5052
sampleMimeType = video/hevc
@@ -75,6 +77,7 @@ track 2:
7577
sample count = 1
7678
track duration = 2100700
7779
format 0:
80+
averageBitrate = 99395
7881
id = 3
7982
containerMimeType = video/mp4
8083
sampleMimeType = application/microvideo-meta-stream
@@ -89,6 +92,7 @@ track 3:
8992
sample count = 1
9093
track duration = 1133700
9194
format 0:
95+
averageBitrate = 416
9296
id = 4
9397
containerMimeType = video/mp4
9498
sampleMimeType = application/motionphoto-image-meta

libraries/test_data/src/test/assets/extractordumps/jpeg/pixel-motion-photo-jfif-segment-shortened.jpg.0.dump

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 1
1212
track duration = 867000
1313
format 0:
14+
averageBitrate = 35692
1415
id = 1
1516
containerMimeType = video/mp4
1617
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/jpeg/pixel-motion-photo-jfif-segment-shortened.jpg.1.dump

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 1
1212
track duration = 867000
1313
format 0:
14+
averageBitrate = 35692
1415
id = 1
1516
containerMimeType = video/mp4
1617
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/jpeg/pixel-motion-photo-jfif-segment-shortened.jpg.2.dump

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 1
1212
track duration = 867000
1313
format 0:
14+
averageBitrate = 35692
1415
id = 1
1516
containerMimeType = video/mp4
1617
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/jpeg/pixel-motion-photo-jfif-segment-shortened.jpg.3.dump

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 1
1212
track duration = 867000
1313
format 0:
14+
averageBitrate = 35692
1415
id = 1
1516
containerMimeType = video/mp4
1617
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/mp4/bt601.mov.0.dump

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 43
1212
track duration = 1019300
1313
format 0:
14+
averageBitrate = 74502
1415
peakBitrate = 200000
1516
id = 1
1617
containerMimeType = video/mp4
@@ -200,6 +201,7 @@ track 1:
200201
sample count = 30
201202
track duration = 1020100
202203
format 0:
204+
averageBitrate = 1026770
203205
id = 2
204206
containerMimeType = video/mp4
205207
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/mp4/bt601.mov.1.dump

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 31
1212
track duration = 1019300
1313
format 0:
14+
averageBitrate = 74502
1415
peakBitrate = 200000
1516
id = 1
1617
containerMimeType = video/mp4
@@ -152,6 +153,7 @@ track 1:
152153
sample count = 30
153154
track duration = 1020100
154155
format 0:
156+
averageBitrate = 1026770
155157
id = 2
156158
containerMimeType = video/mp4
157159
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/mp4/bt601.mov.2.dump

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 16
1212
track duration = 1019300
1313
format 0:
14+
averageBitrate = 74502
1415
peakBitrate = 200000
1516
id = 1
1617
containerMimeType = video/mp4
@@ -92,6 +93,7 @@ track 1:
9293
sample count = 30
9394
track duration = 1020100
9495
format 0:
96+
averageBitrate = 1026770
9597
id = 2
9698
containerMimeType = video/mp4
9799
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/mp4/bt601.mov.3.dump

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 1
1212
track duration = 1019300
1313
format 0:
14+
averageBitrate = 74502
1415
peakBitrate = 200000
1516
id = 1
1617
containerMimeType = video/mp4
@@ -32,6 +33,7 @@ track 1:
3233
sample count = 30
3334
track duration = 1020100
3435
format 0:
36+
averageBitrate = 1026770
3537
id = 2
3638
containerMimeType = video/mp4
3739
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/mp4/bt601.mov.reading_within_gop_sample_dependencies.0.dump

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 43
1212
track duration = 1019300
1313
format 0:
14+
averageBitrate = 74502
1415
peakBitrate = 200000
1516
id = 1
1617
containerMimeType = video/mp4
@@ -200,6 +201,7 @@ track 1:
200201
sample count = 30
201202
track duration = 1020100
202203
format 0:
204+
averageBitrate = 1026770
203205
id = 2
204206
containerMimeType = video/mp4
205207
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/mp4/bt601.mov.reading_within_gop_sample_dependencies.1.dump

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 31
1212
track duration = 1019300
1313
format 0:
14+
averageBitrate = 74502
1415
peakBitrate = 200000
1516
id = 1
1617
containerMimeType = video/mp4
@@ -152,6 +153,7 @@ track 1:
152153
sample count = 30
153154
track duration = 1020100
154155
format 0:
156+
averageBitrate = 1026770
155157
id = 2
156158
containerMimeType = video/mp4
157159
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/mp4/bt601.mov.reading_within_gop_sample_dependencies.2.dump

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 16
1212
track duration = 1019300
1313
format 0:
14+
averageBitrate = 74502
1415
peakBitrate = 200000
1516
id = 1
1617
containerMimeType = video/mp4
@@ -92,6 +93,7 @@ track 1:
9293
sample count = 30
9394
track duration = 1020100
9495
format 0:
96+
averageBitrate = 1026770
9597
id = 2
9698
containerMimeType = video/mp4
9799
sampleMimeType = video/avc

libraries/test_data/src/test/assets/extractordumps/mp4/bt601.mov.reading_within_gop_sample_dependencies.3.dump

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ track 0:
1111
sample count = 1
1212
track duration = 1019300
1313
format 0:
14+
averageBitrate = 74502
1415
peakBitrate = 200000
1516
id = 1
1617
containerMimeType = video/mp4
@@ -32,6 +33,7 @@ track 1:
3233
sample count = 30
3334
track duration = 1020100
3435
format 0:
36+
averageBitrate = 1026770
3537
id = 2
3638
containerMimeType = video/mp4
3739
sampleMimeType = video/avc

0 commit comments

Comments
 (0)