OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/capture/webm_muxer.h" | 5 #include "media/capture/webm_muxer.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "media/audio/audio_parameters.h" | 8 #include "media/audio/audio_parameters.h" |
9 #include "media/base/limits.h" | 9 #include "media/base/limits.h" |
10 #include "media/base/video_frame.h" | 10 #include "media/base/video_frame.h" |
11 #include "media/filters/opus_constants.h" | 11 #include "media/filters/opus_constants.h" |
12 #include "ui/gfx/geometry/size.h" | 12 #include "ui/gfx/geometry/size.h" |
13 | 13 |
14 namespace media { | 14 namespace media { |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 void WriteOpusHeader(const media::AudioParameters& params, uint8* header) { | 18 void WriteOpusHeader(const media::AudioParameters& params, uint8_t* header) { |
19 // See https://wiki.xiph.org/OggOpus#ID_Header. | 19 // See https://wiki.xiph.org/OggOpus#ID_Header. |
20 // Set magic signature. | 20 // Set magic signature. |
21 std::string label = "OpusHead"; | 21 std::string label = "OpusHead"; |
22 memcpy(header + OPUS_EXTRADATA_LABEL_OFFSET, label.c_str(), label.size()); | 22 memcpy(header + OPUS_EXTRADATA_LABEL_OFFSET, label.c_str(), label.size()); |
23 // Set Opus version. | 23 // Set Opus version. |
24 header[OPUS_EXTRADATA_VERSION_OFFSET] = 1; | 24 header[OPUS_EXTRADATA_VERSION_OFFSET] = 1; |
25 // Set channel count. | 25 // Set channel count. |
26 header[OPUS_EXTRADATA_CHANNELS_OFFSET] = params.channels(); | 26 header[OPUS_EXTRADATA_CHANNELS_OFFSET] = params.channels(); |
27 // Set pre-skip | 27 // Set pre-skip |
28 uint16 skip = 0; | 28 uint16_t skip = 0; |
29 memcpy(header + OPUS_EXTRADATA_SKIP_SAMPLES_OFFSET, &skip, sizeof(uint16)); | 29 memcpy(header + OPUS_EXTRADATA_SKIP_SAMPLES_OFFSET, &skip, sizeof(uint16_t)); |
30 // Set original input sample rate in Hz. | 30 // Set original input sample rate in Hz. |
31 uint32 sample_rate = params.sample_rate(); | 31 uint32_t sample_rate = params.sample_rate(); |
32 memcpy(header + OPUS_EXTRADATA_SAMPLE_RATE_OFFSET, &sample_rate, | 32 memcpy(header + OPUS_EXTRADATA_SAMPLE_RATE_OFFSET, &sample_rate, |
33 sizeof(uint32)); | 33 sizeof(uint32_t)); |
34 // Set output gain in dB. | 34 // Set output gain in dB. |
35 uint16 gain = 0; | 35 uint16_t gain = 0; |
36 memcpy(header + OPUS_EXTRADATA_GAIN_OFFSET, &gain, 2); | 36 memcpy(header + OPUS_EXTRADATA_GAIN_OFFSET, &gain, 2); |
37 | 37 |
38 // Set channel mapping. | 38 // Set channel mapping. |
39 if (params.channels() > 2) { | 39 if (params.channels() > 2) { |
40 // Also possible to have a multistream, not supported for now. | 40 // Also possible to have a multistream, not supported for now. |
41 DCHECK_LE(params.channels(), OPUS_MAX_VORBIS_CHANNELS); | 41 DCHECK_LE(params.channels(), OPUS_MAX_VORBIS_CHANNELS); |
42 header[OPUS_EXTRADATA_CHANNEL_MAPPING_OFFSET] = 1; | 42 header[OPUS_EXTRADATA_CHANNEL_MAPPING_OFFSET] = 1; |
43 // Assuming no coupled streams. This should actually be | 43 // Assuming no coupled streams. This should actually be |
44 // channels() - |coupled_streams|. | 44 // channels() - |coupled_streams|. |
45 header[OPUS_EXTRADATA_NUM_STREAMS_OFFSET] = params.channels(); | 45 header[OPUS_EXTRADATA_NUM_STREAMS_OFFSET] = params.channels(); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 | 210 |
211 mkvmuxer::AudioTrack* const audio_track = | 211 mkvmuxer::AudioTrack* const audio_track = |
212 reinterpret_cast<mkvmuxer::AudioTrack*>( | 212 reinterpret_cast<mkvmuxer::AudioTrack*>( |
213 segment_.GetTrackByNumber(audio_track_index_)); | 213 segment_.GetTrackByNumber(audio_track_index_)); |
214 DCHECK(audio_track); | 214 DCHECK(audio_track); |
215 audio_track->set_codec_id(mkvmuxer::Tracks::kOpusCodecId); | 215 audio_track->set_codec_id(mkvmuxer::Tracks::kOpusCodecId); |
216 | 216 |
217 DCHECK_EQ(params.sample_rate(), audio_track->sample_rate()); | 217 DCHECK_EQ(params.sample_rate(), audio_track->sample_rate()); |
218 DCHECK_EQ(params.channels(), static_cast<int>(audio_track->channels())); | 218 DCHECK_EQ(params.channels(), static_cast<int>(audio_track->channels())); |
219 | 219 |
220 uint8 opus_header[OPUS_EXTRADATA_SIZE]; | 220 uint8_t opus_header[OPUS_EXTRADATA_SIZE]; |
221 WriteOpusHeader(params, opus_header); | 221 WriteOpusHeader(params, opus_header); |
222 | 222 |
223 if (!audio_track->SetCodecPrivate(opus_header, OPUS_EXTRADATA_SIZE)) | 223 if (!audio_track->SetCodecPrivate(opus_header, OPUS_EXTRADATA_SIZE)) |
224 LOG(ERROR) << __FUNCTION__ << ": failed to set opus header."; | 224 LOG(ERROR) << __FUNCTION__ << ": failed to set opus header."; |
225 | 225 |
226 // Segment's timestamps should be in milliseconds, DCHECK it. See | 226 // Segment's timestamps should be in milliseconds, DCHECK it. See |
227 // http://www.webmproject.org/docs/container/#muxer-guidelines | 227 // http://www.webmproject.org/docs/container/#muxer-guidelines |
228 DCHECK_EQ(1000000ull, segment_.GetSegmentInfo()->timecode_scale()); | 228 DCHECK_EQ(1000000ull, segment_.GetSegmentInfo()->timecode_scale()); |
229 } | 229 } |
230 | 230 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 std::max(most_recent_timestamp_, timestamp - first_frame_timestamp_); | 269 std::max(most_recent_timestamp_, timestamp - first_frame_timestamp_); |
270 | 270 |
271 segment_.AddFrame(reinterpret_cast<const uint8_t*>(encoded_data->data()), | 271 segment_.AddFrame(reinterpret_cast<const uint8_t*>(encoded_data->data()), |
272 encoded_data->size(), track_index, | 272 encoded_data->size(), track_index, |
273 most_recent_timestamp_.InMicroseconds() * | 273 most_recent_timestamp_.InMicroseconds() * |
274 base::Time::kNanosecondsPerMicrosecond, | 274 base::Time::kNanosecondsPerMicrosecond, |
275 is_key_frame); | 275 is_key_frame); |
276 } | 276 } |
277 | 277 |
278 } // namespace media | 278 } // namespace media |
OLD | NEW |