Chromium Code Reviews| 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 "media/formats/mp2t/es_parser_adts.h" | 5 #include "media/formats/mp2t/es_parser_adts.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 111 DCHECK_EQ(adts_frame.queue_offset, es_queue_->head()); | 111 DCHECK_EQ(adts_frame.queue_offset, es_queue_->head()); |
| 112 es_queue_->Pop(adts_frame.size); | 112 es_queue_->Pop(adts_frame.size); |
| 113 } | 113 } |
| 114 | 114 |
| 115 EsParserAdts::EsParserAdts( | 115 EsParserAdts::EsParserAdts( |
| 116 const NewAudioConfigCB& new_audio_config_cb, | 116 const NewAudioConfigCB& new_audio_config_cb, |
| 117 const EmitBufferCB& emit_buffer_cb, | 117 const EmitBufferCB& emit_buffer_cb, |
| 118 bool sbr_in_mimetype) | 118 bool sbr_in_mimetype) |
| 119 : new_audio_config_cb_(new_audio_config_cb), | 119 : new_audio_config_cb_(new_audio_config_cb), |
| 120 emit_buffer_cb_(emit_buffer_cb), | 120 emit_buffer_cb_(emit_buffer_cb), |
| 121 sbr_in_mimetype_(sbr_in_mimetype), | 121 sbr_in_mimetype_(sbr_in_mimetype) { |
| 122 es_queue_(new media::OffsetByteQueue()) { | |
| 123 } | 122 } |
| 124 | 123 |
| 125 EsParserAdts::~EsParserAdts() { | 124 EsParserAdts::~EsParserAdts() { |
| 126 } | 125 } |
| 127 | 126 |
| 128 bool EsParserAdts::Parse(const uint8* buf, int size, | 127 bool EsParserAdts::ParseFromEsQueue() { |
| 129 base::TimeDelta pts, | |
| 130 DecodeTimestamp dts) { | |
| 131 // The incoming PTS applies to the access unit that comes just after | |
| 132 // the beginning of |buf|. | |
| 133 if (pts != kNoTimestamp()) | |
| 134 pts_list_.push_back(EsPts(es_queue_->tail(), pts)); | |
| 135 | |
| 136 // Copy the input data to the ES buffer. | |
| 137 es_queue_->Push(buf, size); | |
| 138 | |
| 139 // Look for every ADTS frame in the ES buffer. | 128 // Look for every ADTS frame in the ES buffer. |
| 140 AdtsFrame adts_frame; | 129 AdtsFrame adts_frame; |
| 141 while (LookForAdtsFrame(&adts_frame)) { | 130 while (LookForAdtsFrame(&adts_frame)) { |
| 142 // Update the audio configuration if needed. | 131 // Update the audio configuration if needed. |
| 143 DCHECK_GE(adts_frame.size, kADTSHeaderMinSize); | 132 DCHECK_GE(adts_frame.size, kADTSHeaderMinSize); |
| 144 if (!UpdateAudioConfiguration(adts_frame.data)) | 133 if (!UpdateAudioConfiguration(adts_frame.data)) |
| 145 return false; | 134 return false; |
| 146 | 135 |
| 147 // Get the PTS & the duration of this access unit. | 136 // Get the PTS & the duration of this access unit. |
| 148 while (!pts_list_.empty() && | 137 TimingDesc current_timing_desc = |
| 149 pts_list_.front().first <= adts_frame.queue_offset) { | 138 GetTimingDescriptor(adts_frame.queue_offset); |
| 150 audio_timestamp_helper_->SetBaseTimestamp(pts_list_.front().second); | 139 if (current_timing_desc.pts != kNoTimestamp()) |
| 151 pts_list_.pop_front(); | 140 audio_timestamp_helper_->SetBaseTimestamp(current_timing_desc.pts); |
| 152 } | |
| 153 | 141 |
| 154 if (audio_timestamp_helper_->base_timestamp() == kNoTimestamp()) { | 142 if (audio_timestamp_helper_->base_timestamp() == kNoTimestamp()) { |
| 155 DVLOG(1) << "Audio frame with unknown timestamp"; | 143 DVLOG(1) << "Audio frame with unknown timestamp"; |
| 156 return false; | 144 return false; |
| 157 } | 145 } |
| 158 base::TimeDelta current_pts = audio_timestamp_helper_->GetTimestamp(); | 146 base::TimeDelta current_pts = audio_timestamp_helper_->GetTimestamp(); |
| 159 base::TimeDelta frame_duration = | 147 base::TimeDelta frame_duration = |
| 160 audio_timestamp_helper_->GetFrameDuration(kSamplesPerAACFrame); | 148 audio_timestamp_helper_->GetFrameDuration(kSamplesPerAACFrame); |
| 161 | 149 |
| 162 // Emit an audio frame. | 150 // Emit an audio frame. |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 181 SkipAdtsFrame(adts_frame); | 169 SkipAdtsFrame(adts_frame); |
| 182 } | 170 } |
| 183 | 171 |
| 184 return true; | 172 return true; |
| 185 } | 173 } |
| 186 | 174 |
| 187 void EsParserAdts::Flush() { | 175 void EsParserAdts::Flush() { |
| 188 } | 176 } |
| 189 | 177 |
| 190 void EsParserAdts::Reset() { | 178 void EsParserAdts::Reset() { |
| 191 es_queue_.reset(new media::OffsetByteQueue()); | 179 EsParser::Reset(); |
|
wolenetz
2014/08/26 23:01:44
This seems fragile to require overriding method to
damienv1
2014/08/27 16:23:43
Done.
| |
| 192 pts_list_.clear(); | |
| 193 last_audio_decoder_config_ = AudioDecoderConfig(); | 180 last_audio_decoder_config_ = AudioDecoderConfig(); |
| 194 } | 181 } |
| 195 | 182 |
| 196 bool EsParserAdts::UpdateAudioConfiguration(const uint8* adts_header) { | 183 bool EsParserAdts::UpdateAudioConfiguration(const uint8* adts_header) { |
| 197 size_t frequency_index = ExtractAdtsFrequencyIndex(adts_header); | 184 size_t frequency_index = ExtractAdtsFrequencyIndex(adts_header); |
| 198 if (frequency_index >= kADTSFrequencyTableSize) { | 185 if (frequency_index >= kADTSFrequencyTableSize) { |
| 199 // Frequency index 13 & 14 are reserved | 186 // Frequency index 13 & 14 are reserved |
| 200 // while 15 means that the frequency is explicitly written | 187 // while 15 means that the frequency is explicitly written |
| 201 // (not supported). | 188 // (not supported). |
| 202 return false; | 189 return false; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 263 // Audio config notification. | 250 // Audio config notification. |
| 264 last_audio_decoder_config_ = audio_decoder_config; | 251 last_audio_decoder_config_ = audio_decoder_config; |
| 265 new_audio_config_cb_.Run(audio_decoder_config); | 252 new_audio_config_cb_.Run(audio_decoder_config); |
| 266 } | 253 } |
| 267 | 254 |
| 268 return true; | 255 return true; |
| 269 } | 256 } |
| 270 | 257 |
| 271 } // namespace mp2t | 258 } // namespace mp2t |
| 272 } // namespace media | 259 } // namespace media |
| OLD | NEW |