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

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

Issue 119203003: Drop DecryptConfig::data_offset_. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix test Created 6 years, 11 months 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 | Annotate | Revision Log
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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 // Convert the packet if there is a bitstream filter. 109 // Convert the packet if there is a bitstream filter.
110 if (packet->data && bitstream_converter_enabled_ && 110 if (packet->data && bitstream_converter_enabled_ &&
111 !bitstream_converter_->ConvertPacket(packet.get())) { 111 !bitstream_converter_->ConvertPacket(packet.get())) {
112 LOG(ERROR) << "Format conversion failed."; 112 LOG(ERROR) << "Format conversion failed.";
113 } 113 }
114 114
115 // Get side data if any. For now, the only type of side_data is VP8 Alpha. We 115 // Get side data if any. For now, the only type of side_data is VP8 Alpha. We
116 // keep this generic so that other side_data types in the future can be 116 // keep this generic so that other side_data types in the future can be
117 // handled the same way as well. 117 // handled the same way as well.
118 av_packet_split_side_data(packet.get()); 118 av_packet_split_side_data(packet.get());
119
119 scoped_refptr<DecoderBuffer> buffer; 120 scoped_refptr<DecoderBuffer> buffer;
120 121
121 if (type() == DemuxerStream::TEXT) { 122 if (type() == DemuxerStream::TEXT) {
122 int id_size = 0; 123 int id_size = 0;
123 uint8* id_data = av_packet_get_side_data( 124 uint8* id_data = av_packet_get_side_data(
124 packet.get(), 125 packet.get(),
125 AV_PKT_DATA_WEBVTT_IDENTIFIER, 126 AV_PKT_DATA_WEBVTT_IDENTIFIER,
126 &id_size); 127 &id_size);
127 128
128 int settings_size = 0; 129 int settings_size = 0;
129 uint8* settings_data = av_packet_get_side_data( 130 uint8* settings_data = av_packet_get_side_data(
130 packet.get(), 131 packet.get(),
131 AV_PKT_DATA_WEBVTT_SETTINGS, 132 AV_PKT_DATA_WEBVTT_SETTINGS,
132 &settings_size); 133 &settings_size);
133 134
134 std::vector<uint8> side_data; 135 std::vector<uint8> side_data;
135 MakeSideData(id_data, id_data + id_size, 136 MakeSideData(id_data, id_data + id_size,
136 settings_data, settings_data + settings_size, 137 settings_data, settings_data + settings_size,
137 &side_data); 138 &side_data);
138 139
139 buffer = DecoderBuffer::CopyFrom(packet.get()->data, packet.get()->size, 140 buffer = DecoderBuffer::CopyFrom(packet.get()->data, packet.get()->size,
140 side_data.data(), side_data.size()); 141 side_data.data(), side_data.size());
141 } else { 142 } else {
142 int side_data_size = 0; 143 int side_data_size = 0;
143 uint8* side_data = av_packet_get_side_data( 144 uint8* side_data = av_packet_get_side_data(
144 packet.get(), 145 packet.get(),
145 AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, 146 AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,
146 &side_data_size); 147 &side_data_size);
147 148
149 scoped_ptr<DecryptConfig> decrypt_config;
150 int data_offset = 0;
151 if ((type() == DemuxerStream::AUDIO && audio_config_.is_encrypted()) ||
152 (type() == DemuxerStream::VIDEO && video_config_.is_encrypted())) {
153 if (!WebMCreateDecryptConfig(
154 packet->data, packet->size,
155 reinterpret_cast<const uint8*>(encryption_key_id_.data()),
156 encryption_key_id_.size(),
157 &decrypt_config,
158 &data_offset)) {
159 LOG(ERROR) << "Creation of DecryptConfig failed.";
160 }
161 }
162
148 // If a packet is returned by FFmpeg's av_parser_parse2() the packet will 163 // If a packet is returned by FFmpeg's av_parser_parse2() the packet will
149 // reference inner memory of FFmpeg. As such we should transfer the packet 164 // reference inner memory of FFmpeg. As such we should transfer the packet
150 // into memory we control. 165 // into memory we control.
151 if (side_data_size > 0) { 166 if (side_data_size > 0) {
152 buffer = DecoderBuffer::CopyFrom(packet.get()->data, packet.get()->size, 167 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset,
168 packet.get()->size - data_offset,
153 side_data, side_data_size); 169 side_data, side_data_size);
154 } else { 170 } else {
155 buffer = DecoderBuffer::CopyFrom(packet.get()->data, packet.get()->size); 171 buffer = DecoderBuffer::CopyFrom(packet.get()->data + data_offset,
172 packet.get()->size - data_offset);
156 } 173 }
157 174
158 int skip_samples_size = 0; 175 int skip_samples_size = 0;
159 uint8* skip_samples = av_packet_get_side_data(packet.get(), 176 uint8* skip_samples = av_packet_get_side_data(packet.get(),
160 AV_PKT_DATA_SKIP_SAMPLES, 177 AV_PKT_DATA_SKIP_SAMPLES,
161 &skip_samples_size); 178 &skip_samples_size);
162 const int kSkipSamplesValidSize = 10; 179 const int kSkipSamplesValidSize = 10;
163 const int kSkipSamplesOffset = 4; 180 const int kSkipSamplesOffset = 4;
164 if (skip_samples_size >= kSkipSamplesValidSize) { 181 if (skip_samples_size >= kSkipSamplesValidSize) {
165 int discard_padding_samples = base::ByteSwapToLE32( 182 int discard_padding_samples = base::ByteSwapToLE32(
166 *(reinterpret_cast<const uint32*>(skip_samples + 183 *(reinterpret_cast<const uint32*>(skip_samples +
167 kSkipSamplesOffset))); 184 kSkipSamplesOffset)));
168 // TODO(vigneshv): Change decoder buffer to use number of samples so that 185 // TODO(vigneshv): Change decoder buffer to use number of samples so that
169 // this conversion can be avoided. 186 // this conversion can be avoided.
170 buffer->set_discard_padding(base::TimeDelta::FromMicroseconds( 187 buffer->set_discard_padding(base::TimeDelta::FromMicroseconds(
171 discard_padding_samples * 1000000.0 / 188 discard_padding_samples * 1000000.0 /
172 audio_decoder_config().samples_per_second())); 189 audio_decoder_config().samples_per_second()));
173 } 190 }
174 }
175 191
176 if ((type() == DemuxerStream::AUDIO && audio_config_.is_encrypted()) || 192 if (decrypt_config)
177 (type() == DemuxerStream::VIDEO && video_config_.is_encrypted())) { 193 buffer->set_decrypt_config(decrypt_config.Pass());
178 scoped_ptr<DecryptConfig> config(WebMCreateDecryptConfig(
179 packet->data, packet->size,
180 reinterpret_cast<const uint8*>(encryption_key_id_.data()),
181 encryption_key_id_.size()));
182 if (!config)
183 LOG(ERROR) << "Creation of DecryptConfig failed.";
184 buffer->set_decrypt_config(config.Pass());
185 } 194 }
186 195
187 buffer->set_timestamp(ConvertStreamTimestamp( 196 buffer->set_timestamp(ConvertStreamTimestamp(
188 stream_->time_base, packet->pts)); 197 stream_->time_base, packet->pts));
189 buffer->set_duration(ConvertStreamTimestamp( 198 buffer->set_duration(ConvertStreamTimestamp(
190 stream_->time_base, packet->duration)); 199 stream_->time_base, packet->duration));
191 if (buffer->timestamp() != kNoTimestamp() && 200 if (buffer->timestamp() != kNoTimestamp() &&
192 last_packet_timestamp_ != kNoTimestamp() && 201 last_packet_timestamp_ != kNoTimestamp() &&
193 last_packet_timestamp_ < buffer->timestamp()) { 202 last_packet_timestamp_ < buffer->timestamp()) {
194 buffered_ranges_.Add(last_packet_timestamp_, buffer->timestamp()); 203 buffered_ranges_.Add(last_packet_timestamp_, buffer->timestamp());
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 } 943 }
935 for (size_t i = 0; i < buffered.size(); ++i) 944 for (size_t i = 0; i < buffered.size(); ++i)
936 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i)); 945 host_->AddBufferedTimeRange(buffered.start(i), buffered.end(i));
937 } 946 }
938 947
939 void FFmpegDemuxer::OnDataSourceError() { 948 void FFmpegDemuxer::OnDataSourceError() {
940 host_->OnDemuxerError(PIPELINE_ERROR_READ); 949 host_->OnDemuxerError(PIPELINE_ERROR_READ);
941 } 950 }
942 951
943 } // namespace media 952 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698