Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / media / filters / frame_processor_base.cc
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.
4
5 #include "media/filters/frame_processor_base.h"
6
7 #include "base/stl_util.h"
8 #include "media/base/buffers.h"
9
10 namespace media {
11
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),
17       stream_(stream) {
18   DCHECK(stream_);
19 }
20
21 MseTrackBuffer::~MseTrackBuffer() {
22   DVLOG(2) << __FUNCTION__ << "()";
23 }
24
25 void MseTrackBuffer::Reset() {
26   DVLOG(2) << __FUNCTION__ << "()";
27
28   last_decode_timestamp_ = kNoTimestamp();
29   last_frame_duration_ = kNoTimestamp();
30   highest_presentation_timestamp_ = kNoTimestamp();
31   needs_random_access_point_ = true;
32 }
33
34 void MseTrackBuffer::SetHighestPresentationTimestampIfIncreased(
35     base::TimeDelta timestamp) {
36   if (highest_presentation_timestamp_ == kNoTimestamp() ||
37       timestamp > highest_presentation_timestamp_) {
38     highest_presentation_timestamp_ = timestamp;
39   }
40 }
41
42 FrameProcessorBase::FrameProcessorBase()
43     : sequence_mode_(false),
44       group_start_timestamp_(kNoTimestamp()) {}
45
46 FrameProcessorBase::~FrameProcessorBase() {
47   DVLOG(2) << __FUNCTION__ << "()";
48
49   STLDeleteValues(&track_buffers_);
50 }
51
52 void FrameProcessorBase::SetGroupStartTimestampIfInSequenceMode(
53     base::TimeDelta timestamp_offset) {
54   DVLOG(2) << __FUNCTION__ << "(" << timestamp_offset.InSecondsF() << ")";
55   DCHECK(kNoTimestamp() != timestamp_offset);
56   if (sequence_mode_)
57     group_start_timestamp_ = timestamp_offset;
58 }
59
60 bool FrameProcessorBase::AddTrack(StreamParser::TrackId id,
61                                   ChunkDemuxerStream* stream) {
62   DVLOG(2) << __FUNCTION__ << "(): id=" << id;
63
64   MseTrackBuffer* existing_track = FindTrack(id);
65   DCHECK(!existing_track);
66   if (existing_track)
67     return false;
68
69   track_buffers_[id] = new MseTrackBuffer(stream);
70   return true;
71 }
72
73 void FrameProcessorBase::Reset() {
74   DVLOG(2) << __FUNCTION__ << "()";
75   for (TrackBufferMap::iterator itr = track_buffers_.begin();
76        itr != track_buffers_.end(); ++itr) {
77     itr->second->Reset();
78   }
79 }
80
81 MseTrackBuffer* FrameProcessorBase::FindTrack(StreamParser::TrackId id) {
82   TrackBufferMap::iterator itr = track_buffers_.find(id);
83   if (itr == track_buffers_.end())
84     return NULL;
85
86   return itr->second;
87 }
88
89 void FrameProcessorBase::NotifyNewMediaSegmentStarting(
90     base::TimeDelta segment_timestamp) {
91   DVLOG(2) << __FUNCTION__ << "(" << segment_timestamp.InSecondsF() << ")";
92
93   for (TrackBufferMap::iterator itr = track_buffers_.begin();
94        itr != track_buffers_.end();
95        ++itr) {
96     itr->second->stream()->OnNewMediaSegment(segment_timestamp);
97   }
98 }
99
100 }  // namespace media