OLD | NEW |
---|---|
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 #include "chromecast/media/cma/ipc_streamer/decoder_buffer_base_marshaller.h" | 5 #include "chromecast/media/cma/ipc_streamer/decoder_buffer_base_marshaller.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "chromecast/media/cma/base/decoder_buffer_base.h" | 8 #include "chromecast/media/cma/base/decoder_buffer_base.h" |
9 #include "chromecast/media/cma/ipc/media_message.h" | 9 #include "chromecast/media/cma/ipc/media_message.h" |
10 #include "chromecast/media/cma/ipc/media_message_type.h" | 10 #include "chromecast/media/cma/ipc/media_message_type.h" |
11 #include "chromecast/media/cma/ipc_streamer/decrypt_config_marshaller.h" | 11 #include "chromecast/media/cma/ipc_streamer/decrypt_config_marshaller.h" |
12 #include "media/base/decrypt_config.h" | 12 #include "media/base/decrypt_config.h" |
13 | 13 |
14 namespace chromecast { | 14 namespace chromecast { |
15 namespace media { | 15 namespace media { |
16 | 16 |
17 namespace { | 17 namespace { |
18 const size_t kMaxFrameSize = 4 * 1024 * 1024; | 18 const size_t kMaxFrameSize = 4 * 1024 * 1024; |
19 | 19 |
20 class DecoderBufferFromMsg : public DecoderBufferBase { | 20 class DecoderBufferFromMsg : public DecoderBufferBase { |
21 public: | 21 public: |
22 explicit DecoderBufferFromMsg(scoped_ptr<MediaMessage> msg); | 22 explicit DecoderBufferFromMsg(scoped_ptr<MediaMessage> msg); |
23 | 23 |
24 void Initialize(); | 24 void Initialize(); |
25 | 25 |
26 // DecoderBufferBase implementation. | 26 // DecoderBufferBase implementation. |
27 StreamId stream_id() const override; | |
27 base::TimeDelta timestamp() const override; | 28 base::TimeDelta timestamp() const override; |
28 const uint8* data() const override; | 29 const uint8* data() const override; |
29 uint8* writable_data() const override; | 30 uint8* writable_data() const override; |
30 size_t data_size() const override; | 31 size_t data_size() const override; |
31 const ::media::DecryptConfig* decrypt_config() const override; | 32 const ::media::DecryptConfig* decrypt_config() const override; |
32 bool end_of_stream() const override; | 33 bool end_of_stream() const override; |
33 | 34 |
34 private: | 35 private: |
35 ~DecoderBufferFromMsg() override; | 36 ~DecoderBufferFromMsg() override; |
36 | 37 |
37 // Indicates whether this is an end of stream frame. | 38 // Indicates whether this is an end of stream frame. |
38 bool is_eos_; | 39 bool is_eos_; |
39 | 40 |
41 // Stream Id this decoder buffer belonging to. | |
gunsch
2015/05/22 01:45:26
wording: "Stream this decoder buffer belongs to."
erickung1
2015/05/22 17:33:22
Done.
| |
42 StreamId stream_id_; | |
43 | |
40 // Frame timestamp. | 44 // Frame timestamp. |
41 base::TimeDelta pts_; | 45 base::TimeDelta pts_; |
42 | 46 |
43 // CENC parameters. | 47 // CENC parameters. |
44 scoped_ptr< ::media::DecryptConfig> decrypt_config_; | 48 scoped_ptr< ::media::DecryptConfig> decrypt_config_; |
45 | 49 |
46 // Size of the frame. | 50 // Size of the frame. |
47 size_t data_size_; | 51 size_t data_size_; |
48 | 52 |
49 // Keeps the message since frame data is not copied. | 53 // Keeps the message since frame data is not copied. |
50 scoped_ptr<MediaMessage> msg_; | 54 scoped_ptr<MediaMessage> msg_; |
51 uint8* data_; | 55 uint8* data_; |
52 | 56 |
53 DISALLOW_COPY_AND_ASSIGN(DecoderBufferFromMsg); | 57 DISALLOW_COPY_AND_ASSIGN(DecoderBufferFromMsg); |
54 }; | 58 }; |
55 | 59 |
56 DecoderBufferFromMsg::DecoderBufferFromMsg( | 60 DecoderBufferFromMsg::DecoderBufferFromMsg( |
57 scoped_ptr<MediaMessage> msg) | 61 scoped_ptr<MediaMessage> msg) |
58 : is_eos_(true), | 62 : is_eos_(true), |
63 stream_id_(kPrimary), | |
59 msg_(msg.Pass()), | 64 msg_(msg.Pass()), |
60 data_(NULL) { | 65 data_(NULL) { |
61 CHECK(msg_); | 66 CHECK(msg_); |
62 } | 67 } |
63 | 68 |
64 DecoderBufferFromMsg::~DecoderBufferFromMsg() { | 69 DecoderBufferFromMsg::~DecoderBufferFromMsg() { |
65 } | 70 } |
66 | 71 |
67 void DecoderBufferFromMsg::Initialize() { | 72 void DecoderBufferFromMsg::Initialize() { |
68 CHECK_EQ(msg_->type(), FrameMediaMsg); | 73 CHECK_EQ(msg_->type(), FrameMediaMsg); |
69 | 74 |
70 CHECK(msg_->ReadPod(&is_eos_)); | 75 CHECK(msg_->ReadPod(&is_eos_)); |
71 if (is_eos_) | 76 if (is_eos_) |
72 return; | 77 return; |
73 | 78 |
79 CHECK(msg_->ReadPod(&stream_id_)); | |
80 | |
74 int64 pts_internal = 0; | 81 int64 pts_internal = 0; |
75 CHECK(msg_->ReadPod(&pts_internal)); | 82 CHECK(msg_->ReadPod(&pts_internal)); |
76 pts_ = base::TimeDelta::FromInternalValue(pts_internal); | 83 pts_ = base::TimeDelta::FromInternalValue(pts_internal); |
77 | 84 |
78 bool has_decrypt_config = false; | 85 bool has_decrypt_config = false; |
79 CHECK(msg_->ReadPod(&has_decrypt_config)); | 86 CHECK(msg_->ReadPod(&has_decrypt_config)); |
80 if (has_decrypt_config) | 87 if (has_decrypt_config) |
81 decrypt_config_.reset(DecryptConfigMarshaller::Read(msg_.get()).release()); | 88 decrypt_config_.reset(DecryptConfigMarshaller::Read(msg_.get()).release()); |
82 | 89 |
83 CHECK(msg_->ReadPod(&data_size_)); | 90 CHECK(msg_->ReadPod(&data_size_)); |
84 CHECK_GT(data_size_, 0u); | 91 CHECK_GT(data_size_, 0u); |
85 CHECK_LT(data_size_, kMaxFrameSize); | 92 CHECK_LT(data_size_, kMaxFrameSize); |
86 | 93 |
87 // Get a pointer to the frame data inside the message. | 94 // Get a pointer to the frame data inside the message. |
88 // Avoid copying the frame data here. | 95 // Avoid copying the frame data here. |
89 data_ = static_cast<uint8*>(msg_->GetWritableBuffer(data_size_)); | 96 data_ = static_cast<uint8*>(msg_->GetWritableBuffer(data_size_)); |
90 CHECK(data_); | 97 CHECK(data_); |
91 | 98 |
92 if (decrypt_config_) { | 99 if (decrypt_config_) { |
93 uint32 subsample_total_size = 0; | 100 uint32 subsample_total_size = 0; |
94 for (size_t k = 0; k < decrypt_config_->subsamples().size(); k++) { | 101 for (size_t k = 0; k < decrypt_config_->subsamples().size(); k++) { |
95 subsample_total_size += decrypt_config_->subsamples()[k].clear_bytes; | 102 subsample_total_size += decrypt_config_->subsamples()[k].clear_bytes; |
96 subsample_total_size += decrypt_config_->subsamples()[k].cypher_bytes; | 103 subsample_total_size += decrypt_config_->subsamples()[k].cypher_bytes; |
97 } | 104 } |
98 CHECK_EQ(subsample_total_size, data_size_); | 105 CHECK_EQ(subsample_total_size, data_size_); |
99 } | 106 } |
100 } | 107 } |
101 | 108 |
109 StreamId DecoderBufferFromMsg::stream_id() const { | |
110 return stream_id_; | |
gunsch
2015/05/22 01:45:26
you could just return kPrimary here and not have t
erickung1
2015/05/22 17:33:22
Although right now all code uses kPrimary, we shou
| |
111 } | |
112 | |
102 base::TimeDelta DecoderBufferFromMsg::timestamp() const { | 113 base::TimeDelta DecoderBufferFromMsg::timestamp() const { |
103 return pts_; | 114 return pts_; |
104 } | 115 } |
105 | 116 |
106 const uint8* DecoderBufferFromMsg::data() const { | 117 const uint8* DecoderBufferFromMsg::data() const { |
107 CHECK(msg_->IsSerializedMsgAvailable()); | 118 CHECK(msg_->IsSerializedMsgAvailable()); |
108 return data_; | 119 return data_; |
109 } | 120 } |
110 | 121 |
111 uint8* DecoderBufferFromMsg::writable_data() const { | 122 uint8* DecoderBufferFromMsg::writable_data() const { |
(...skipping 16 matching lines...) Expand all Loading... | |
128 } // namespace | 139 } // namespace |
129 | 140 |
130 // static | 141 // static |
131 void DecoderBufferBaseMarshaller::Write( | 142 void DecoderBufferBaseMarshaller::Write( |
132 const scoped_refptr<DecoderBufferBase>& buffer, | 143 const scoped_refptr<DecoderBufferBase>& buffer, |
133 MediaMessage* msg) { | 144 MediaMessage* msg) { |
134 CHECK(msg->WritePod(buffer->end_of_stream())); | 145 CHECK(msg->WritePod(buffer->end_of_stream())); |
135 if (buffer->end_of_stream()) | 146 if (buffer->end_of_stream()) |
136 return; | 147 return; |
137 | 148 |
149 CHECK(msg->WritePod(buffer->stream_id())); | |
138 CHECK(msg->WritePod(buffer->timestamp().ToInternalValue())); | 150 CHECK(msg->WritePod(buffer->timestamp().ToInternalValue())); |
139 | 151 |
140 bool has_decrypt_config = | 152 bool has_decrypt_config = |
141 (buffer->decrypt_config() != NULL && | 153 (buffer->decrypt_config() != NULL && |
142 buffer->decrypt_config()->iv().size() > 0); | 154 buffer->decrypt_config()->iv().size() > 0); |
143 CHECK(msg->WritePod(has_decrypt_config)); | 155 CHECK(msg->WritePod(has_decrypt_config)); |
144 | 156 |
145 if (has_decrypt_config) { | 157 if (has_decrypt_config) { |
146 // DecryptConfig may contain 0 subsamples if all content is encrypted. | 158 // DecryptConfig may contain 0 subsamples if all content is encrypted. |
147 // Map this case to a single fully-encrypted "subsample" for more consistent | 159 // Map this case to a single fully-encrypted "subsample" for more consistent |
(...skipping 20 matching lines...) Expand all Loading... | |
168 scoped_refptr<DecoderBufferBase> DecoderBufferBaseMarshaller::Read( | 180 scoped_refptr<DecoderBufferBase> DecoderBufferBaseMarshaller::Read( |
169 scoped_ptr<MediaMessage> msg) { | 181 scoped_ptr<MediaMessage> msg) { |
170 scoped_refptr<DecoderBufferFromMsg> buffer( | 182 scoped_refptr<DecoderBufferFromMsg> buffer( |
171 new DecoderBufferFromMsg(msg.Pass())); | 183 new DecoderBufferFromMsg(msg.Pass())); |
172 buffer->Initialize(); | 184 buffer->Initialize(); |
173 return buffer; | 185 return buffer; |
174 } | 186 } |
175 | 187 |
176 } // namespace media | 188 } // namespace media |
177 } // namespace chromecast | 189 } // namespace chromecast |
OLD | NEW |