Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1091)

Side by Side Diff: media/filters/ffmpeg_demuxer.cc

Issue 712593003: Move key frame flag from StreamParserBuffer to DecoderBuffer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/filters/ffmpeg_demuxer.h" 5 #include "media/filters/ffmpeg_demuxer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 LOG(ERROR) << "Format conversion failed."; 189 LOG(ERROR) << "Format conversion failed.";
190 } 190 }
191 #endif 191 #endif
192 192
193 // Get side data if any. For now, the only type of side_data is VP8 Alpha. We 193 // Get side data if any. For now, the only type of side_data is VP8 Alpha. We
194 // keep this generic so that other side_data types in the future can be 194 // keep this generic so that other side_data types in the future can be
195 // handled the same way as well. 195 // handled the same way as well.
196 av_packet_split_side_data(packet.get()); 196 av_packet_split_side_data(packet.get());
197 197
198 scoped_refptr<DecoderBuffer> buffer; 198 scoped_refptr<DecoderBuffer> buffer;
199 bool is_keyframe = packet.get()->flags & AV_PKT_FLAG_KEY;
199 200
200 if (type() == DemuxerStream::TEXT) { 201 if (type() == DemuxerStream::TEXT) {
201 int id_size = 0; 202 int id_size = 0;
202 uint8* id_data = av_packet_get_side_data( 203 uint8* id_data = av_packet_get_side_data(
203 packet.get(), 204 packet.get(),
204 AV_PKT_DATA_WEBVTT_IDENTIFIER, 205 AV_PKT_DATA_WEBVTT_IDENTIFIER,
205 &id_size); 206 &id_size);
206 207
207 int settings_size = 0; 208 int settings_size = 0;
208 uint8* settings_data = av_packet_get_side_data( 209 uint8* settings_data = av_packet_get_side_data(
209 packet.get(), 210 packet.get(),
210 AV_PKT_DATA_WEBVTT_SETTINGS, 211 AV_PKT_DATA_WEBVTT_SETTINGS,
211 &settings_size); 212 &settings_size);
212 213
213 std::vector<uint8> side_data; 214 std::vector<uint8> side_data;
214 MakeSideData(id_data, id_data + id_size, 215 MakeSideData(id_data, id_data + id_size,
215 settings_data, settings_data + settings_size, 216 settings_data, settings_data + settings_size,
216 &side_data); 217 &side_data);
217 218
218 buffer = DecoderBuffer::CopyFrom(packet.get()->data, packet.get()->size, 219 buffer = DecoderBuffer::CopyFrom(packet.get()->data, packet.get()->size,
219 side_data.data(), side_data.size()); 220 side_data.data(), side_data.size(),
221 is_keyframe);
220 } else { 222 } else {
221 int side_data_size = 0; 223 int side_data_size = 0;
222 uint8* side_data = av_packet_get_side_data( 224 uint8* side_data = av_packet_get_side_data(
223 packet.get(), 225 packet.get(),
224 AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, 226 AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
225 &side_data_size); 227 &side_data_size);
226 228
227 scoped_ptr<DecryptConfig> decrypt_config; 229 scoped_ptr<DecryptConfig> decrypt_config;
228 int data_offset = 0; 230 int data_offset = 0;
229 if ((type() == DemuxerStream::AUDIO && audio_config_.is_encrypted()) || 231 if ((type() == DemuxerStream::AUDIO && audio_config_.is_encrypted()) ||
230 (type() == DemuxerStream::VIDEO && video_config_.is_encrypted())) { 232 (type() == DemuxerStream::VIDEO && video_config_.is_encrypted())) {
231 if (!WebMCreateDecryptConfig( 233 if (!WebMCreateDecryptConfig(
232 packet->data, packet->size, 234 packet->data, packet->size,
233 reinterpret_cast<const uint8*>(encryption_key_id_.data()), 235 reinterpret_cast<const uint8*>(encryption_key_id_.data()),
234 encryption_key_id_.size(), 236 encryption_key_id_.size(),
235 &decrypt_config, 237 &decrypt_config,
236 &data_offset)) { 238 &data_offset)) {
237 LOG(ERROR) << "Creation of DecryptConfig failed."; 239 LOG(ERROR) << "Creation of DecryptConfig failed.";
238 } 240 }
239 } 241 }
240 242
241 // If a packet is returned by FFmpeg's av_parser_parse2() the packet will 243 // If a packet is returned by FFmpeg's av_parser_parse2() the packet will
242 // reference inner memory of FFmpeg. As such we should transfer the packet 244 // reference inner memory of FFmpeg. As such we should transfer the packet
243 // into memory we control. 245 // into memory we control.
244 if (side_data_size > 0) { 246 if (side_data_size > 0) {
245 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset, 247 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset,
246 packet.get()->size - data_offset, 248 packet.get()->size - data_offset,
247 side_data, side_data_size); 249 side_data, side_data_size,
250 is_keyframe);
248 } else { 251 } else {
249 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset, 252 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset,
250 packet.get()->size - data_offset); 253 packet.get()->size - data_offset,
254 is_keyframe);
251 } 255 }
252 256
253 int skip_samples_size = 0; 257 int skip_samples_size = 0;
254 const uint32* skip_samples_ptr = 258 const uint32* skip_samples_ptr =
255 reinterpret_cast<const uint32*>(av_packet_get_side_data( 259 reinterpret_cast<const uint32*>(av_packet_get_side_data(
256 packet.get(), AV_PKT_DATA_SKIP_SAMPLES, &skip_samples_size)); 260 packet.get(), AV_PKT_DATA_SKIP_SAMPLES, &skip_samples_size));
257 const int kSkipSamplesValidSize = 10; 261 const int kSkipSamplesValidSize = 10;
258 const int kSkipEndSamplesOffset = 1; 262 const int kSkipEndSamplesOffset = 1;
259 if (skip_samples_size >= kSkipSamplesValidSize) { 263 if (skip_samples_size >= kSkipSamplesValidSize) {
260 // Because FFmpeg rolls codec delay and skip samples into one we can only 264 // Because FFmpeg rolls codec delay and skip samples into one we can only
(...skipping 1003 matching lines...) Expand 10 before | Expand all | Expand 10 after
1264 } 1268 }
1265 for (size_t i = 0; i < buffered.size(); ++i) 1269 for (size_t i = 0; i < buffered.size(); ++i)
1266 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); 1270 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i));
1267 } 1271 }
1268 1272
1269 void FFmpegDemuxer::OnDataSourceError() { 1273 void FFmpegDemuxer::OnDataSourceError() {
1270 host_->OnDemuxerError(PIPELINE_ERROR_READ); 1274 host_->OnDemuxerError(PIPELINE_ERROR_READ);
1271 } 1275 }
1272 1276
1273 } // namespace media 1277 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698