OLD | NEW |
---|---|
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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
43 base::Time timeline_offset; | 43 base::Time timeline_offset; |
44 if (entry != NULL && entry->value != NULL && | 44 if (entry != NULL && entry->value != NULL && |
45 FFmpegUTCDateToTime(entry->value, &timeline_offset)) { | 45 FFmpegUTCDateToTime(entry->value, &timeline_offset)) { |
46 return timeline_offset; | 46 return timeline_offset; |
47 } | 47 } |
48 } | 48 } |
49 | 49 |
50 return base::Time(); | 50 return base::Time(); |
51 } | 51 } |
52 | 52 |
53 static base::TimeDelta FramesToTimeDelta(int frames, double sample_rate) { | |
54 return base::TimeDelta::FromMicroseconds( | |
55 frames * base::Time::kMicrosecondsPerSecond / sample_rate); | |
56 } | |
57 | |
53 // | 58 // |
54 // FFmpegDemuxerStream | 59 // FFmpegDemuxerStream |
55 // | 60 // |
56 FFmpegDemuxerStream::FFmpegDemuxerStream( | 61 FFmpegDemuxerStream::FFmpegDemuxerStream( |
57 FFmpegDemuxer* demuxer, | 62 FFmpegDemuxer* demuxer, |
58 AVStream* stream) | 63 AVStream* stream) |
59 : demuxer_(demuxer), | 64 : demuxer_(demuxer), |
60 task_runner_(base::MessageLoopProxy::current()), | 65 task_runner_(base::MessageLoopProxy::current()), |
61 stream_(stream), | 66 stream_(stream), |
62 type_(UNKNOWN), | 67 type_(UNKNOWN), |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
182 if (side_data_size > 0) { | 187 if (side_data_size > 0) { |
183 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset, | 188 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset, |
184 packet.get()->size - data_offset, | 189 packet.get()->size - data_offset, |
185 side_data, side_data_size); | 190 side_data, side_data_size); |
186 } else { | 191 } else { |
187 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset, | 192 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset, |
188 packet.get()->size - data_offset); | 193 packet.get()->size - data_offset); |
189 } | 194 } |
190 | 195 |
191 int skip_samples_size = 0; | 196 int skip_samples_size = 0; |
192 uint8* skip_samples = av_packet_get_side_data(packet.get(), | 197 const uint32* skip_samples_ptr = |
193 AV_PKT_DATA_SKIP_SAMPLES, | 198 reinterpret_cast<const uint32*>(av_packet_get_side_data( |
194 &skip_samples_size); | 199 packet.get(), AV_PKT_DATA_SKIP_SAMPLES, &skip_samples_size)); |
195 const int kSkipSamplesValidSize = 10; | 200 const int kSkipSamplesValidSize = 10; |
196 const int kSkipSamplesOffset = 4; | 201 const int kSkipEndSamplesOffset = 4; |
197 if (skip_samples_size >= kSkipSamplesValidSize) { | 202 if (skip_samples_size >= kSkipSamplesValidSize) { |
198 int discard_padding_samples = base::ByteSwapToLE32( | 203 const int discard_front_samples = base::ByteSwapToLE32(*skip_samples_ptr); |
199 *(reinterpret_cast<const uint32*>(skip_samples + | 204 const int discard_end_samples = |
200 kSkipSamplesOffset))); | 205 base::ByteSwapToLE32(*(skip_samples_ptr + kSkipEndSamplesOffset)); |
201 // TODO(vigneshv): Change decoder buffer to use number of samples so that | 206 const int samples_per_second = |
202 // this conversion can be avoided. | 207 audio_decoder_config().samples_per_second(); |
203 buffer->set_discard_padding(base::TimeDelta::FromMicroseconds( | 208 buffer->set_discard_padding(std::make_pair( |
wolenetz
2014/04/29 19:18:08
nit: as discussed, possibly restrict ffmpeg skip_s
DaleCurtis
2014/04/30 22:04:04
Done.
| |
204 discard_padding_samples * 1000000.0 / | 209 FramesToTimeDelta(discard_front_samples, samples_per_second), |
205 audio_decoder_config().samples_per_second())); | 210 FramesToTimeDelta(discard_end_samples, samples_per_second))); |
206 } | 211 } |
207 | 212 |
208 if (decrypt_config) | 213 if (decrypt_config) |
209 buffer->set_decrypt_config(decrypt_config.Pass()); | 214 buffer->set_decrypt_config(decrypt_config.Pass()); |
210 } | 215 } |
211 | 216 |
212 buffer->set_timestamp(ConvertStreamTimestamp( | 217 buffer->set_timestamp(ConvertStreamTimestamp( |
213 stream_->time_base, packet->pts)); | 218 stream_->time_base, packet->pts)); |
214 buffer->set_duration(ConvertStreamTimestamp( | 219 buffer->set_duration(ConvertStreamTimestamp( |
215 stream_->time_base, packet->duration)); | 220 stream_->time_base, packet->duration)); |
(...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1016 } | 1021 } |
1017 for (size_t i = 0; i < buffered.size(); ++i) | 1022 for (size_t i = 0; i < buffered.size(); ++i) |
1018 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); | 1023 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); |
1019 } | 1024 } |
1020 | 1025 |
1021 void FFmpegDemuxer::OnDataSourceError() { | 1026 void FFmpegDemuxer::OnDataSourceError() { |
1022 host_->OnDemuxerError(PIPELINE_ERROR_READ); | 1027 host_->OnDemuxerError(PIPELINE_ERROR_READ); |
1023 } | 1028 } |
1024 | 1029 |
1025 } // namespace media | 1030 } // namespace media |
OLD | NEW |