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
3 // found in the LICENSE file.
5 #include "media/filters/frame_processor_base.h"
7 #include "base/stl_util.h"
8 #include "media/base/buffers.h"
12 MseTrackBuffer::MseTrackBuffer(ChunkDemuxerStream* stream)
13 : last_decode_timestamp_(kNoTimestamp()),
14 last_frame_duration_(kNoTimestamp()),
15 highest_presentation_timestamp_(kNoTimestamp()),
16 needs_random_access_point_(true),
21 MseTrackBuffer::~MseTrackBuffer() {
22 DVLOG(2) << __FUNCTION__ << "()";
25 void MseTrackBuffer::Reset() {
26 DVLOG(2) << __FUNCTION__ << "()";
28 last_decode_timestamp_ = kNoTimestamp();
29 last_frame_duration_ = kNoTimestamp();
30 highest_presentation_timestamp_ = kNoTimestamp();
31 needs_random_access_point_ = true;
34 void MseTrackBuffer::SetHighestPresentationTimestampIfIncreased(
35 base::TimeDelta timestamp) {
36 if (highest_presentation_timestamp_ == kNoTimestamp() ||
37 timestamp > highest_presentation_timestamp_) {
38 highest_presentation_timestamp_ = timestamp;
42 FrameProcessorBase::FrameProcessorBase()
43 : sequence_mode_(false),
44 group_start_timestamp_(kNoTimestamp()) {}
46 FrameProcessorBase::~FrameProcessorBase() {
47 DVLOG(2) << __FUNCTION__ << "()";
49 STLDeleteValues(&track_buffers_);
52 void FrameProcessorBase::SetGroupStartTimestampIfInSequenceMode(
53 base::TimeDelta timestamp_offset) {
54 DVLOG(2) << __FUNCTION__ << "(" << timestamp_offset.InSecondsF() << ")";
55 DCHECK(kNoTimestamp() != timestamp_offset);
57 group_start_timestamp_ = timestamp_offset;
60 bool FrameProcessorBase::AddTrack(StreamParser::TrackId id,
61 ChunkDemuxerStream* stream) {
62 DVLOG(2) << __FUNCTION__ << "(): id=" << id;
64 MseTrackBuffer* existing_track = FindTrack(id);
65 DCHECK(!existing_track);
69 track_buffers_[id] = new MseTrackBuffer(stream);
73 void FrameProcessorBase::Reset() {
74 DVLOG(2) << __FUNCTION__ << "()";
75 for (TrackBufferMap::iterator itr = track_buffers_.begin();
76 itr != track_buffers_.end(); ++itr) {
81 MseTrackBuffer* FrameProcessorBase::FindTrack(StreamParser::TrackId id) {
82 TrackBufferMap::iterator itr = track_buffers_.find(id);
83 if (itr == track_buffers_.end())
89 void FrameProcessorBase::NotifyNewMediaSegmentStarting(
90 base::TimeDelta segment_timestamp) {
91 DVLOG(2) << __FUNCTION__ << "(" << segment_timestamp.InSecondsF() << ")";
93 for (TrackBufferMap::iterator itr = track_buffers_.begin();
94 itr != track_buffers_.end();
96 itr->second->stream()->OnNewMediaSegment(segment_timestamp);