aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/matroskadec.c
diff options
context:
space:
mode:
authorVignesh Venkatasubramanian <vigneshv@google.com>2014-10-01 10:13:31 -0700
committerMichael Niedermayer <michaelni@gmx.at>2014-10-01 20:47:18 +0200
commitb1071db3dfc6fdfe927bc12b5681e63660102145 (patch)
tree383bcd080c6236ab71405eecc951cda8f051dd28 /libavformat/matroskadec.c
parent8acb76567aba59be91c9af4aa45b3a0900c57439 (diff)
downloadffmpeg-b1071db3dfc6fdfe927bc12b5681e63660102145.tar.gz
lavf/webm_dash: Fix incorrect bandwidth computation
Fix incorrect bandwidth computation in some cases. When the cue end descriptor is null (i.e.) start_time_ns == -1, existing bandwidth computed (if any) should be returned rather than returning 0. Signed-off-by: Vignesh Venkatasubramanian <vigneshv@google.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r--libavformat/matroskadec.c96
1 files changed, 49 insertions, 47 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index d856fccfc0..0e405c7387 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -3188,55 +3188,57 @@ static int64_t webm_dash_manifest_compute_bandwidth(AVFormatContext *s, int64_t
}
if (desc_end.start_time_ns == -1) {
// The prebuffer is larger than the duration.
- return (matroska->duration * matroska->time_scale >= prebuffered_ns) ? -1 : 0;
- }
-
- // The prebuffer ends in the last Cue. Estimate how much data was
- // prebuffered.
- pre_bytes = desc_end.end_offset - desc_end.start_offset;
- pre_ns = desc_end.end_time_ns - desc_end.start_time_ns;
- pre_sec = pre_ns / nano_seconds_per_second;
- prebuffer_bytes +=
- pre_bytes * ((temp_prebuffer_ns / nano_seconds_per_second) / pre_sec);
-
- prebuffer = prebuffer_ns / nano_seconds_per_second;
-
- // Set this to 0.0 in case our prebuffer buffers the entire video.
- bits_per_second = 0.0;
- do {
- int64_t desc_bytes = desc_end.end_offset - desc_beg.start_offset;
- int64_t desc_ns = desc_end.end_time_ns - desc_beg.start_time_ns;
- double desc_sec = desc_ns / nano_seconds_per_second;
- double calc_bits_per_second = (desc_bytes * 8) / desc_sec;
-
- // Drop the bps by the percentage of bytes buffered.
- double percent = (desc_bytes - prebuffer_bytes) / desc_bytes;
- double mod_bits_per_second = calc_bits_per_second * percent;
-
- if (prebuffer < desc_sec) {
- double search_sec =
- (double)(matroska->duration * matroska->time_scale) / nano_seconds_per_second;
-
- // Add 1 so the bits per second should be a little bit greater than file
- // datarate.
- int64_t bps = (int64_t)(mod_bits_per_second) + 1;
- const double min_buffer = 0.0;
- double buffer = prebuffer;
- double sec_to_download = 0.0;
-
- int rv = buffer_size_after_time_downloaded(prebuffered_ns, search_sec, bps,
- min_buffer, &buffer, &sec_to_download,
- s, cues_start);
- if (rv < 0) {
- return -1;
- } else if (rv == 0) {
- bits_per_second = (double)(bps);
- break;
+ if (matroska->duration * matroska->time_scale >= prebuffered_ns)
+ return -1;
+ bits_per_second = 0.0;
+ } else {
+ // The prebuffer ends in the last Cue. Estimate how much data was
+ // prebuffered.
+ pre_bytes = desc_end.end_offset - desc_end.start_offset;
+ pre_ns = desc_end.end_time_ns - desc_end.start_time_ns;
+ pre_sec = pre_ns / nano_seconds_per_second;
+ prebuffer_bytes +=
+ pre_bytes * ((temp_prebuffer_ns / nano_seconds_per_second) / pre_sec);
+
+ prebuffer = prebuffer_ns / nano_seconds_per_second;
+
+ // Set this to 0.0 in case our prebuffer buffers the entire video.
+ bits_per_second = 0.0;
+ do {
+ int64_t desc_bytes = desc_end.end_offset - desc_beg.start_offset;
+ int64_t desc_ns = desc_end.end_time_ns - desc_beg.start_time_ns;
+ double desc_sec = desc_ns / nano_seconds_per_second;
+ double calc_bits_per_second = (desc_bytes * 8) / desc_sec;
+
+ // Drop the bps by the percentage of bytes buffered.
+ double percent = (desc_bytes - prebuffer_bytes) / desc_bytes;
+ double mod_bits_per_second = calc_bits_per_second * percent;
+
+ if (prebuffer < desc_sec) {
+ double search_sec =
+ (double)(matroska->duration * matroska->time_scale) / nano_seconds_per_second;
+
+ // Add 1 so the bits per second should be a little bit greater than file
+ // datarate.
+ int64_t bps = (int64_t)(mod_bits_per_second) + 1;
+ const double min_buffer = 0.0;
+ double buffer = prebuffer;
+ double sec_to_download = 0.0;
+
+ int rv = buffer_size_after_time_downloaded(prebuffered_ns, search_sec, bps,
+ min_buffer, &buffer, &sec_to_download,
+ s, cues_start);
+ if (rv < 0) {
+ return -1;
+ } else if (rv == 0) {
+ bits_per_second = (double)(bps);
+ break;
+ }
}
- }
- desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
- } while (desc_end.start_time_ns != -1);
+ desc_end = get_cue_desc(s, desc_end.end_time_ns, cues_start);
+ } while (desc_end.start_time_ns != -1);
+ }
if (bandwidth < bits_per_second) bandwidth = bits_per_second;
}
return (int64_t)bandwidth;