Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Side by Side Diff: media/filters/source_buffer_range.h

Issue 1670033002: Reland: MSE: Relax the 'media segment must begin with keyframe' requirement (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes and tests for bugs 581125 and 581458, which caused previous attempt to be reverted Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_ 5 #ifndef MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_
6 #define MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_ 6 #define MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <map> 10 #include <map>
(...skipping 19 matching lines...) Expand all
30 30
31 // Policy for handling large gaps between buffers. Continuous media like 31 // Policy for handling large gaps between buffers. Continuous media like
32 // audio & video should use NO_GAPS_ALLOWED. Discontinuous media like 32 // audio & video should use NO_GAPS_ALLOWED. Discontinuous media like
33 // timed text should use ALLOW_GAPS because large differences in timestamps 33 // timed text should use ALLOW_GAPS because large differences in timestamps
34 // are common and acceptable. 34 // are common and acceptable.
35 enum GapPolicy { 35 enum GapPolicy {
36 NO_GAPS_ALLOWED, 36 NO_GAPS_ALLOWED,
37 ALLOW_GAPS 37 ALLOW_GAPS
38 }; 38 };
39 39
40 // Buffers with the same timestamp are only allowed under certain conditions. 40 // Sequential buffers with the same decode timestamp make sense under certain
41 // More precisely, it is allowed in all situations except when the previous 41 // conditions, typically when the first buffer is a keyframe. Due to some
42 // frame is not a key frame and the current is a key frame. 42 // atypical media append behaviors where a new keyframe might have the same
43 // Examples of situations where DTS of two consecutive frames can be equal: 43 // timestamp as a previous non-keyframe, the playback of the sequence might
44 // involve some throwaway decode work. This method supports detecting this
45 // situation so that callers can log warnings (it returns true in this case
46 // only).
47 // For all other cases, including more typical same-DTS sequences, this method
48 // returns false. Examples of typical situations where DTS of two consecutive
49 // frames can be equal:
44 // - Video: VP8 Alt-Ref frames. 50 // - Video: VP8 Alt-Ref frames.
45 // - Video: IPBPBP...: DTS for I frame and for P frame can be equal. 51 // - Video: IPBPBP...: DTS for I frame and for P frame can be equal.
46 // - Text track cues that start at same time. 52 // - Text track cues that start at same time.
47 // Returns true if |prev_is_keyframe| and |current_is_keyframe| indicate a 53 // Returns true if |prev_is_keyframe| and |current_is_keyframe| indicate a
48 // same timestamp situation that is allowed. False is returned otherwise. 54 // same timestamp situation that is atypical. False is returned otherwise.
49 static bool AllowSameTimestamp(bool prev_is_keyframe, 55 static bool IsUncommonSameTimestampSequence(bool prev_is_keyframe,
wolenetz 2016/02/05 23:27:24 Note that I've inverted the logic and the name her
50 bool current_is_keyframe); 56 bool current_is_keyframe);
51 57
52 // Creates a source buffer range with |new_buffers|. |new_buffers| cannot be 58 // Creates a source buffer range with |new_buffers|. |new_buffers| cannot be
53 // empty and the front of |new_buffers| must be a keyframe. 59 // empty and the front of |new_buffers| must be a keyframe.
54 // |media_segment_start_time| refers to the starting timestamp for the media 60 // |media_segment_start_time| refers to the starting timestamp for the media
55 // segment to which these buffers belong. 61 // segment to which these buffers belong.
56 SourceBufferRange(GapPolicy gap_policy, 62 SourceBufferRange(GapPolicy gap_policy,
57 const BufferQueue& new_buffers, 63 const BufferQueue& new_buffers,
58 DecodeTimestamp media_segment_start_time, 64 DecodeTimestamp media_segment_start_time,
59 const InterbufferDistanceCB& interbuffer_distance_cb); 65 const InterbufferDistanceCB& interbuffer_distance_cb);
60 66
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 197
192 // Returns true if this range's buffered timespan completely overlaps the 198 // Returns true if this range's buffered timespan completely overlaps the
193 // buffered timespan of |range|. 199 // buffered timespan of |range|.
194 bool CompletelyOverlaps(const SourceBufferRange& range) const; 200 bool CompletelyOverlaps(const SourceBufferRange& range) const;
195 201
196 // Returns true if the end of this range contains buffers that overlaps with 202 // Returns true if the end of this range contains buffers that overlaps with
197 // the beginning of |range|. 203 // the beginning of |range|.
198 bool EndOverlaps(const SourceBufferRange& range) const; 204 bool EndOverlaps(const SourceBufferRange& range) const;
199 205
200 // Returns true if |timestamp| is the timestamp of the next buffer in 206 // Returns true if |timestamp| is the timestamp of the next buffer in
201 // sequence after |buffers_.back()|, false otherwise. 207 // sequence after |buffers_.back()|, false othewise.
wolenetz 2016/02/05 23:27:24 nit-to-self: fix this typo.
wolenetz 2016/02/12 01:23:47 Done.
202 bool IsNextInSequence(DecodeTimestamp timestamp, bool is_key_frame) const; 208 bool IsNextInSequence(DecodeTimestamp timestamp) const;
203 209
204 // Adds all buffers which overlap [start, end) to the end of |buffers|. If 210 // Adds all buffers which overlap [start, end) to the end of |buffers|. If
205 // no buffers exist in the range returns false, true otherwise. 211 // no buffers exist in the range returns false, true otherwise.
206 bool GetBuffersInRange(DecodeTimestamp start, DecodeTimestamp end, 212 bool GetBuffersInRange(DecodeTimestamp start, DecodeTimestamp end,
207 BufferQueue* buffers); 213 BufferQueue* buffers);
208 214
209 size_t size_in_bytes() const { return size_in_bytes_; } 215 size_t size_in_bytes() const { return size_in_bytes_; }
210 216
211 private: 217 private:
212 typedef std::map<DecodeTimestamp, int> KeyframeMap; 218 typedef std::map<DecodeTimestamp, int> KeyframeMap;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 296
291 // Stores the amount of memory taken up by the data in |buffers_|. 297 // Stores the amount of memory taken up by the data in |buffers_|.
292 size_t size_in_bytes_; 298 size_t size_in_bytes_;
293 299
294 DISALLOW_COPY_AND_ASSIGN(SourceBufferRange); 300 DISALLOW_COPY_AND_ASSIGN(SourceBufferRange);
295 }; 301 };
296 302
297 } // namespace media 303 } // namespace media
298 304
299 #endif // MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_ 305 #endif // MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698