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

Side by Side Diff: media/capture/webm_muxer.cc

Issue 1233033002: MediaStream: Adding VideoTrackRecorder class and unittests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: miu@s comment on OnFirstFrameCB and OnEncodedVideoCB Created 5 years, 4 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
OLDNEW
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 <limits> 7 #include <limits>
8 8
9 #include "base/bind.h"
10
9 namespace media { 11 namespace media {
10 12
11 WebmMuxer::WebmMuxer(const WriteDataCB& write_data_callback) 13 WebmMuxer::WebmMuxer(const WriteDataCB& write_data_callback)
12 : write_data_callback_(write_data_callback), 14 : write_data_callback_(write_data_callback),
13 position_(0) { 15 position_(0),
16 weak_factory_(this) {
14 DCHECK(thread_checker_.CalledOnValidThread()); 17 DCHECK(thread_checker_.CalledOnValidThread());
15 segment_.Init(this); 18 segment_.Init(this);
16 segment_.set_mode(mkvmuxer::Segment::kLive); 19 segment_.set_mode(mkvmuxer::Segment::kLive);
17 segment_.OutputCues(false); 20 segment_.OutputCues(false);
18 21
19 mkvmuxer::SegmentInfo* const info = segment_.GetSegmentInfo(); 22 mkvmuxer::SegmentInfo* const info = segment_.GetSegmentInfo();
20 info->set_writing_app("Chrome"); 23 info->set_writing_app("Chrome");
21 info->set_muxing_app("Chrome"); 24 info->set_muxing_app("Chrome");
22 } 25 }
23 26
24 WebmMuxer::~WebmMuxer() { 27 WebmMuxer::~WebmMuxer() {
25 DCHECK(thread_checker_.CalledOnValidThread()); 28 DCHECK(thread_checker_.CalledOnValidThread());
26 segment_.Finalize(); 29 segment_.Finalize();
27 } 30 }
28 31
29 uint64_t WebmMuxer::AddVideoTrack(const gfx::Size& frame_size, 32 WebmMuxer::OnEncodedVideoCB
30 double frame_rate) { 33 WebmMuxer::AddVideoTrack(const gfx::Size& frame_size, double frame_rate) {
31 DCHECK(thread_checker_.CalledOnValidThread()); 34 DCHECK(thread_checker_.CalledOnValidThread());
32 35
33 const uint64_t track_index = 36 const uint64_t track_index =
34 segment_.AddVideoTrack(frame_size.width(), frame_size.height(), 0); 37 segment_.AddVideoTrack(frame_size.width(), frame_size.height(), 0);
35 38
36 mkvmuxer::VideoTrack* const video_track = 39 mkvmuxer::VideoTrack* const video_track =
37 reinterpret_cast<mkvmuxer::VideoTrack*>( 40 reinterpret_cast<mkvmuxer::VideoTrack*>(
38 segment_.GetTrackByNumber(track_index)); 41 segment_.GetTrackByNumber(track_index));
39 DCHECK(video_track); 42 DCHECK(video_track);
40 video_track->set_codec_id(mkvmuxer::Tracks::kVp8CodecId); 43 video_track->set_codec_id(mkvmuxer::Tracks::kVp8CodecId);
41 DCHECK_EQ(video_track->crop_right(), 0ull); 44 DCHECK_EQ(video_track->crop_right(), 0ull);
42 DCHECK_EQ(video_track->crop_left(), 0ull); 45 DCHECK_EQ(video_track->crop_left(), 0ull);
43 DCHECK_EQ(video_track->crop_top(), 0ull); 46 DCHECK_EQ(video_track->crop_top(), 0ull);
44 DCHECK_EQ(video_track->crop_bottom(), 0ull); 47 DCHECK_EQ(video_track->crop_bottom(), 0ull);
45 48
46 video_track->set_frame_rate(frame_rate); 49 video_track->set_frame_rate(frame_rate);
47 video_track->set_default_duration(base::Time::kMicrosecondsPerSecond / 50 video_track->set_default_duration(base::Time::kMicrosecondsPerSecond /
48 frame_rate); 51 frame_rate);
49 // Segment's timestamps should be in milliseconds, DCHECK it. See 52 // Segment's timestamps should be in milliseconds, DCHECK it. See
50 // http://www.webmproject.org/docs/container/#muxer-guidelines 53 // http://www.webmproject.org/docs/container/#muxer-guidelines
51 DCHECK_EQ(segment_.GetSegmentInfo()->timecode_scale(), 1000000ull); 54 DCHECK_EQ(segment_.GetSegmentInfo()->timecode_scale(), 1000000ull);
52 55
53 return track_index; 56 return base::Bind(&WebmMuxer::OnEncodedVideo, weak_factory_.GetWeakPtr(),
57 track_index);
54 } 58 }
55 59
56 void WebmMuxer::OnEncodedVideo(uint64_t track_number, 60 void WebmMuxer::OnEncodedVideo(uint64_t track_number,
57 const base::StringPiece& encoded_data, 61 const base::StringPiece& encoded_data,
58 base::TimeDelta timestamp, 62 base::TimeDelta timestamp,
59 bool keyframe) { 63 bool keyframe) {
60 DCHECK(thread_checker_.CalledOnValidThread()); 64 DCHECK(thread_checker_.CalledOnValidThread());
61 // |track_number|, a caller-side identifier, cannot be zero (!), see 65 // |track_number|, a caller-side identifier, cannot be zero (!), see
62 // http://www.matroska.org/technical/specs/index.html#Tracks 66 // http://www.matroska.org/technical/specs/index.html#Tracks
63 DCHECK_GT(track_number, 0u); 67 DCHECK_GT(track_number, 0u);
(...skipping 25 matching lines...) Expand all
89 } 93 }
90 94
91 void WebmMuxer::ElementStartNotify(mkvmuxer::uint64 element_id, 95 void WebmMuxer::ElementStartNotify(mkvmuxer::uint64 element_id,
92 mkvmuxer::int64 position) { 96 mkvmuxer::int64 position) {
93 // This method gets pinged before items are sent to |write_data_callback_|. 97 // This method gets pinged before items are sent to |write_data_callback_|.
94 DCHECK_GE(position, position_.ValueOrDefault(0)) 98 DCHECK_GE(position, position_.ValueOrDefault(0))
95 << "Can't go back in a live WebM stream."; 99 << "Can't go back in a live WebM stream.";
96 } 100 }
97 101
98 } // namespace media 102 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698