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

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

Issue 2343543002: MSE: Replace crossfade splicing overlap trimming. (Closed)
Patch Set: Merge and feedback. Created 4 years, 1 month 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
« no previous file with comments | « media/filters/source_buffer_state_unittest.cc ('k') | media/filters/source_buffer_stream.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // SourceBufferStream is a data structure that stores media Buffers in ranges. 5 // SourceBufferStream is a data structure that stores media Buffers in ranges.
6 // Buffers can be appended out of presentation order. Buffers are retrieved by 6 // Buffers can be appended out of presentation order. Buffers are retrieved by
7 // seeking to the desired start point and calling GetNextBuffer(). Buffers are 7 // seeking to the desired start point and calling GetNextBuffer(). Buffers are
8 // returned in sequential presentation order. 8 // returned in sequential presentation order.
9 9
10 #ifndef MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_ 10 #ifndef MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 kEndOfStream 50 kEndOfStream
51 }; 51 };
52 52
53 enum Type { 53 enum Type {
54 kAudio, 54 kAudio,
55 kVideo, 55 kVideo,
56 kText 56 kText
57 }; 57 };
58 58
59 SourceBufferStream(const AudioDecoderConfig& audio_config, 59 SourceBufferStream(const AudioDecoderConfig& audio_config,
60 const scoped_refptr<MediaLog>& media_log, 60 const scoped_refptr<MediaLog>& media_log);
61 bool splice_frames_enabled);
62 SourceBufferStream(const VideoDecoderConfig& video_config, 61 SourceBufferStream(const VideoDecoderConfig& video_config,
63 const scoped_refptr<MediaLog>& media_log, 62 const scoped_refptr<MediaLog>& media_log);
64 bool splice_frames_enabled);
65 SourceBufferStream(const TextTrackConfig& text_config, 63 SourceBufferStream(const TextTrackConfig& text_config,
66 const scoped_refptr<MediaLog>& media_log, 64 const scoped_refptr<MediaLog>& media_log);
67 bool splice_frames_enabled);
68 65
69 ~SourceBufferStream(); 66 ~SourceBufferStream();
70 67
71 // Signals that the next buffers appended are part of a new coded frame group 68 // Signals that the next buffers appended are part of a new coded frame group
72 // starting at |coded_frame_group_start_time|. 69 // starting at |coded_frame_group_start_time|.
73 // TODO(acolwell/wolenetz): This should be changed to a presentation 70 // TODO(acolwell/wolenetz): This should be changed to a presentation
74 // timestamp. See http://crbug.com/402502 71 // timestamp. See http://crbug.com/402502
75 void OnStartOfCodedFrameGroup(DecodeTimestamp coded_frame_group_start_time); 72 void OnStartOfCodedFrameGroup(DecodeTimestamp coded_frame_group_start_time);
76 73
77 // Add the |buffers| to the SourceBufferStream. Buffers within the queue are 74 // Add the |buffers| to the SourceBufferStream. Buffers within the queue are
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 278
282 // Searches |ranges_| for the first keyframe timestamp that is >= |timestamp|. 279 // Searches |ranges_| for the first keyframe timestamp that is >= |timestamp|.
283 // If |ranges_| doesn't contain a GOP that covers |timestamp| or doesn't 280 // If |ranges_| doesn't contain a GOP that covers |timestamp| or doesn't
284 // have a keyframe after |timestamp| then kNoTimestamp is returned. 281 // have a keyframe after |timestamp| then kNoTimestamp is returned.
285 DecodeTimestamp FindKeyframeAfterTimestamp(const DecodeTimestamp timestamp); 282 DecodeTimestamp FindKeyframeAfterTimestamp(const DecodeTimestamp timestamp);
286 283
287 // Returns "VIDEO" for a video SourceBufferStream, "AUDIO" for an audio 284 // Returns "VIDEO" for a video SourceBufferStream, "AUDIO" for an audio
288 // stream, and "TEXT" for a text stream. 285 // stream, and "TEXT" for a text stream.
289 std::string GetStreamTypeName() const; 286 std::string GetStreamTypeName() const;
290 287
288 // (Audio only) If |new_buffers| overlap existing buffers, trims end of
289 // existing buffers to remove overlap. |new_buffers| are not modified.
290 void TrimSpliceOverlap(const BufferQueue& new_buffers);
291
291 // Returns true if end of stream has been reached, i.e. the 292 // Returns true if end of stream has been reached, i.e. the
292 // following conditions are met: 293 // following conditions are met:
293 // 1. end of stream is marked and there is nothing in the track_buffer. 294 // 1. end of stream is marked and there is nothing in the track_buffer.
294 // 2. We don't have any ranges, or the last or no range is selected, 295 // 2. We don't have any ranges, or the last or no range is selected,
295 // or there is a pending seek beyond any existing ranges. 296 // or there is a pending seek beyond any existing ranges.
296 bool IsEndOfStreamReached() const; 297 bool IsEndOfStreamReached() const;
297 298
298 // Deletes the range pointed to by |*itr| and removes it from |ranges_|. 299 // Deletes the range pointed to by |*itr| and removes it from |ranges_|.
299 // If |*itr| points to |selected_range_|, then |selected_range_| is set to 300 // If |*itr| points to |selected_range_|, then |selected_range_| is set to
300 // NULL. After the range is removed, |*itr| is to the range after the one that 301 // NULL. After the range is removed, |*itr| is to the range after the one that
(...skipping 25 matching lines...) Expand all
326 // Helper function used by RemoveInternal() to evaluate whether remove will 327 // Helper function used by RemoveInternal() to evaluate whether remove will
327 // disrupt the last appended GOP. If disruption is expected, reset state 328 // disrupt the last appended GOP. If disruption is expected, reset state
328 // tracking the last append. This will trigger frame filtering in Append() 329 // tracking the last append. This will trigger frame filtering in Append()
329 // until a new key frame is provided. 330 // until a new key frame is provided.
330 void UpdateLastAppendStateForRemove(DecodeTimestamp remove_start, 331 void UpdateLastAppendStateForRemove(DecodeTimestamp remove_start,
331 DecodeTimestamp remove_end, 332 DecodeTimestamp remove_end,
332 bool exclude_start); 333 bool exclude_start);
333 334
334 Type GetType() const; 335 Type GetType() const;
335 336
336 // See GetNextBuffer() for additional details. This method handles splice
337 // frame processing.
338 Status HandleNextBufferWithSplice(
339 scoped_refptr<StreamParserBuffer>* out_buffer);
340
341 // See GetNextBuffer() for additional details. This method handles preroll 337 // See GetNextBuffer() for additional details. This method handles preroll
342 // frame processing. 338 // frame processing.
343 Status HandleNextBufferWithPreroll( 339 Status HandleNextBufferWithPreroll(
344 scoped_refptr<StreamParserBuffer>* out_buffer); 340 scoped_refptr<StreamParserBuffer>* out_buffer);
345 341
346 // See GetNextBuffer() for additional details. The internal method hands out 342 // See GetNextBuffer() for additional details. The internal method hands out
347 // single buffers from the |track_buffer_| and |selected_range_| without 343 // single buffers from the |track_buffer_| and |selected_range_| without
348 // additional processing for splice frame or preroll buffers. 344 // additional processing for preroll buffers.
349 Status GetNextBufferInternal(scoped_refptr<StreamParserBuffer>* out_buffer); 345 Status GetNextBufferInternal(scoped_refptr<StreamParserBuffer>* out_buffer);
350 346
351 // If the next buffer's timestamp is significantly beyond the last output 347 // If the next buffer's timestamp is significantly beyond the last output
352 // buffer, and if we just exhausted |track_buffer_| on the previous read, this 348 // buffer, and if we just exhausted |track_buffer_| on the previous read, this
353 // method logs a warning to |media_log_| that there could be perceivable 349 // method logs a warning to |media_log_| that there could be perceivable
354 // delay. Apps can avoid this behavior by not overlap-appending buffers near 350 // delay. Apps can avoid this behavior by not overlap-appending buffers near
355 // current playback position. 351 // current playback position.
356 void WarnIfTrackBufferExhaustionSkipsForward( 352 void WarnIfTrackBufferExhaustionSkipsForward(
357 const scoped_refptr<StreamParserBuffer>& next_buffer); 353 const scoped_refptr<StreamParserBuffer>& next_buffer);
358 354
359 // Called by PrepareRangesForNextAppend() before pruning overlapped buffers to 355 // If |out_buffer| has preroll, sets |pending_buffer_| to feed out preroll and
360 // generate a splice frame with a small portion of the overlapped buffers. If 356 // returns true. Otherwise returns false.
361 // a splice frame is generated, the first buffer in |new_buffers| will have
362 // its timestamps, duration, and fade out preroll updated.
363 void GenerateSpliceFrame(const BufferQueue& new_buffers);
364
365 // If |out_buffer| has splice buffers or preroll, sets |pending_buffer_|
366 // appropriately and returns true. Otherwise returns false.
367 bool SetPendingBuffer(scoped_refptr<StreamParserBuffer>* out_buffer); 357 bool SetPendingBuffer(scoped_refptr<StreamParserBuffer>* out_buffer);
368 358
369 // Used to report log messages that can help the web developer figure out what 359 // Used to report log messages that can help the web developer figure out what
370 // is wrong with the content. 360 // is wrong with the content.
371 scoped_refptr<MediaLog> media_log_; 361 scoped_refptr<MediaLog> media_log_;
372 362
373 // List of disjoint buffered ranges, ordered by start time. 363 // List of disjoint buffered ranges, ordered by start time.
374 RangeList ranges_; 364 RangeList ranges_;
375 365
376 // Indicates which decoder config is being used by the decoder. 366 // Indicates which decoder config is being used by the decoder.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 432
443 // The maximum amount of data in bytes the stream will keep in memory. 433 // The maximum amount of data in bytes the stream will keep in memory.
444 size_t memory_limit_; 434 size_t memory_limit_;
445 435
446 // Indicates that a kConfigChanged status has been reported by GetNextBuffer() 436 // Indicates that a kConfigChanged status has been reported by GetNextBuffer()
447 // and GetCurrentXXXDecoderConfig() must be called to update the current 437 // and GetCurrentXXXDecoderConfig() must be called to update the current
448 // config. GetNextBuffer() must not be called again until 438 // config. GetNextBuffer() must not be called again until
449 // GetCurrentXXXDecoderConfig() has been called. 439 // GetCurrentXXXDecoderConfig() has been called.
450 bool config_change_pending_ = false; 440 bool config_change_pending_ = false;
451 441
452 // Used by HandleNextBufferWithSplice() or HandleNextBufferWithPreroll() when 442 // Used by HandleNextBufferWithPreroll() when a buffer with preroll is
453 // a splice frame buffer or buffer with preroll is returned from 443 // returned from GetNextBufferInternal().
454 // GetNextBufferInternal().
455 scoped_refptr<StreamParserBuffer> pending_buffer_; 444 scoped_refptr<StreamParserBuffer> pending_buffer_;
456 445
457 // Indicates which of the splice buffers in |splice_buffer_| should be
458 // handled out next.
459 size_t splice_buffers_index_ = 0;
460
461 // Indicates that all buffers before |pending_buffer_| have been handed out. 446 // Indicates that all buffers before |pending_buffer_| have been handed out.
462 bool pending_buffers_complete_ = false; 447 bool pending_buffers_complete_ = false;
463 448
464 // Indicates that splice frame generation is enabled. 449 // To prevent log spam, count the number of logs for different log scenarios.
465 const bool splice_frames_enabled_; 450 int num_splice_logs_ = 0;
466
467 // To prevent log spam, count the number of warnings and successes logged.
468 int num_splice_generation_warning_logs_ = 0;
469 int num_splice_generation_success_logs_ = 0;
470 int num_track_buffer_gap_warning_logs_ = 0; 451 int num_track_buffer_gap_warning_logs_ = 0;
471 int num_garbage_collect_algorithm_logs_ = 0; 452 int num_garbage_collect_algorithm_logs_ = 0;
472 int num_strange_same_timestamps_logs_ = 0; 453 int num_strange_same_timestamps_logs_ = 0;
473 454
474 DISALLOW_COPY_AND_ASSIGN(SourceBufferStream); 455 DISALLOW_COPY_AND_ASSIGN(SourceBufferStream);
475 }; 456 };
476 457
477 } // namespace media 458 } // namespace media
478 459
479 #endif // MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_ 460 #endif // MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_
OLDNEW
« no previous file with comments | « media/filters/source_buffer_state_unittest.cc ('k') | media/filters/source_buffer_stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698