1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "media/base/stream_parser_buffer.h"
#include <algorithm>
#include "base/check_op.h"
#include "base/memory/ptr_util.h"
#include "media/base/timestamp_constants.h"
namespace media {
scoped_refptr<StreamParserBuffer> StreamParserBuffer::CreateEOSBuffer() {
return base::WrapRefCounted(new StreamParserBuffer(
NULL, 0, NULL, 0, false, DemuxerStream::UNKNOWN, 0));
}
scoped_refptr<StreamParserBuffer> StreamParserBuffer::CopyFrom(
const uint8_t* data,
int data_size,
bool is_key_frame,
Type type,
TrackId track_id) {
return base::WrapRefCounted(new StreamParserBuffer(
data, data_size, NULL, 0, is_key_frame, type, track_id));
}
scoped_refptr<StreamParserBuffer> StreamParserBuffer::CopyFrom(
const uint8_t* data,
int data_size,
const uint8_t* side_data,
int side_data_size,
bool is_key_frame,
Type type,
TrackId track_id) {
return base::WrapRefCounted(
new StreamParserBuffer(data, data_size, side_data, side_data_size,
is_key_frame, type, track_id));
}
DecodeTimestamp StreamParserBuffer::GetDecodeTimestamp() const {
if (decode_timestamp_ == kNoDecodeTimestamp)
return DecodeTimestamp::FromPresentationTime(timestamp());
return decode_timestamp_;
}
void StreamParserBuffer::SetDecodeTimestamp(DecodeTimestamp timestamp) {
decode_timestamp_ = timestamp;
if (preroll_buffer_)
preroll_buffer_->SetDecodeTimestamp(timestamp);
}
StreamParserBuffer::StreamParserBuffer(const uint8_t* data,
int data_size,
const uint8_t* side_data,
int side_data_size,
bool is_key_frame,
Type type,
TrackId track_id)
: DecoderBuffer(data, data_size, side_data, side_data_size),
decode_timestamp_(kNoDecodeTimestamp),
config_id_(kInvalidConfigId),
type_(type),
track_id_(track_id),
is_duration_estimated_(false) {
// TODO(scherkus): Should DataBuffer constructor accept a timestamp and
// duration to force clients to set them? Today they end up being zero which
// is both a common and valid value and could lead to bugs.
if (data) {
set_duration(kNoTimestamp);
}
if (is_key_frame)
set_is_key_frame(true);
}
StreamParserBuffer::~StreamParserBuffer() = default;
int StreamParserBuffer::GetConfigId() const {
return config_id_;
}
void StreamParserBuffer::SetConfigId(int config_id) {
config_id_ = config_id;
if (preroll_buffer_)
preroll_buffer_->SetConfigId(config_id);
}
const char* StreamParserBuffer::GetTypeName() const {
return DemuxerStream::GetTypeName(type());
}
void StreamParserBuffer::SetPrerollBuffer(
scoped_refptr<StreamParserBuffer> preroll_buffer) {
DCHECK(!preroll_buffer_);
DCHECK(!end_of_stream());
DCHECK(!preroll_buffer->end_of_stream());
DCHECK(!preroll_buffer->preroll_buffer_);
DCHECK(preroll_buffer->timestamp() <= timestamp());
DCHECK(preroll_buffer->discard_padding() == DecoderBuffer::DiscardPadding());
DCHECK_EQ(preroll_buffer->type(), type());
DCHECK_EQ(preroll_buffer->track_id(), track_id());
preroll_buffer_ = std::move(preroll_buffer);
preroll_buffer_->set_timestamp(timestamp());
preroll_buffer_->SetConfigId(GetConfigId());
preroll_buffer_->SetDecodeTimestamp(GetDecodeTimestamp());
// Mark the entire buffer for discard.
preroll_buffer_->set_discard_padding(
std::make_pair(kInfiniteDuration, base::TimeDelta()));
}
void StreamParserBuffer::set_timestamp(base::TimeDelta timestamp) {
DecoderBuffer::set_timestamp(timestamp);
if (preroll_buffer_)
preroll_buffer_->set_timestamp(timestamp);
}
} // namespace media
|