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

Side by Side Diff: extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc

Issue 1860083002: [chrome.displaySource][WiFi Display] Media pipeline infrastructure (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed session Id generation Created 4 years, 8 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
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_media _pipeline.h"
6
7 #include "base/logging.h"
8 #include "content/public/renderer/render_thread.h"
9 #include "content/public/renderer/video_encode_accelerator.h"
10 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_eleme ntary_stream_descriptor.h"
11 #include "extensions/renderer/api/display_source/wifi_display/wifi_display_eleme ntary_stream_info.h"
12
13 namespace extensions {
14
15 namespace {
16
17 const char kErrorVideoEncoderError[] = "Unrepairable video encoder error";
18
19 } // namespace
20
21 WiFiDisplayMediaPipeline::WiFiDisplayMediaPipeline(
22 wds::SessionType type,
23 const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
24 const wds::AudioCodec& audio_codec,
25 const ErrorCallback& error_callback)
26 : type_(type),
27 video_parameters_(video_parameters),
28 audio_codec_(audio_codec),
29 error_callback_(error_callback),
30 weak_factory_(this) {
31 }
32
33 // static
34 scoped_ptr<WiFiDisplayMediaPipeline> WiFiDisplayMediaPipeline::Create(
35 wds::SessionType type,
36 const WiFiDisplayVideoEncoder::InitParameters& video_parameters,
37 const wds::AudioCodec& audio_codec,
38 const ErrorCallback& error_callback) {
39 return scoped_ptr<WiFiDisplayMediaPipeline>(
40 new WiFiDisplayMediaPipeline(type,
41 video_parameters,
42 audio_codec,
43 error_callback));
44 }
45
46 WiFiDisplayMediaPipeline::~WiFiDisplayMediaPipeline() {
47 }
48
49 void WiFiDisplayMediaPipeline::InsertRawVideoFrame(
50 const scoped_refptr<media::VideoFrame>& video_frame,
51 base::TimeTicks reference_time) {
52 DCHECK(video_encoder_);
53 video_encoder_->InsertRawVideoFrame(video_frame, reference_time);
54 }
55
56 void WiFiDisplayMediaPipeline::RequestIDRPicture() {
57 DCHECK(video_encoder_);
58 video_encoder_->RequestIDRPicture();
59 }
60
61 void WiFiDisplayMediaPipeline::Initialize(
62 const InitCompletionCallback& callback) {
63 DCHECK(init_completion_callback_.is_null());
64 init_completion_callback_ = callback;
65
66 CreateMediaPacketizer();
67
68 if (type_ & wds::VideoSession) {
69 CreateVideoEncoder();
70 return;
71 }
72
73 init_completion_callback_.Run(true);
74 }
75
76 void WiFiDisplayMediaPipeline::CreateVideoEncoder() {
77 DCHECK(!video_encoder_);
78 auto result_callback =
79 base::Bind(&WiFiDisplayMediaPipeline::OnVideoEncoderCreated,
80 weak_factory_.GetWeakPtr());
81 WiFiDisplayVideoEncoder::Create(video_parameters_,
82 result_callback);
83 }
84
85 void WiFiDisplayMediaPipeline::CreateMediaPacketizer() {
86 DCHECK(!packetizer_);
87 std::vector<WiFiDisplayElementaryStreamInfo> stream_infos;
88 if (type_ & wds::VideoSession) {
89 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors;
90 descriptors.emplace_back(
91 WiFiDisplayElementaryStreamDescriptor::AVCTimingAndHRD::Create());
92 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::VIDEO_H264,
93 std::move(descriptors));
94 }
95
96 if (type_ & wds::AudioSession) {
97 using LPCMAudioStreamDescriptor =
98 WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream;
99 std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors;
100 descriptors.emplace_back(
101 LPCMAudioStreamDescriptor::Create(
102 audio_codec_.modes.test(wds::LPCM_48K_16B_2CH)
103 ? LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_48K
104 : LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_44_1K,
105 LPCMAudioStreamDescriptor::BITS_PER_SAMPLE_16,
106 false, // emphasis_flag
107 LPCMAudioStreamDescriptor::NUMBER_OF_CHANNELS_STEREO));
108 stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::AUDIO_LPCM,
109 std::move(descriptors));
110 }
111
112 packetizer_.reset(new WiFiDisplayMediaPacketizer(
113 base::TimeDelta::FromMilliseconds(200),
114 std::move(stream_infos),
115 base::Bind(&WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket,
116 base::Unretained(this))));
117 }
118
119 void WiFiDisplayMediaPipeline::OnVideoEncoderCreated(
120 scoped_refptr<WiFiDisplayVideoEncoder> video_encoder) {
121 if (!video_encoder) {
122 init_completion_callback_.Run(false);
123 return;
124 }
125 video_encoder_ = std::move(video_encoder);
126 auto encoded_callback = base::Bind(
127 &WiFiDisplayMediaPipeline::OnEncodedVideoFrame,
128 weak_factory_.GetWeakPtr());
129 auto error_callback = base::Bind(error_callback_, kErrorVideoEncoderError);
130 video_encoder_->SetCallbacks(encoded_callback, error_callback);
131 init_completion_callback_.Run(true);
132 }
133
134 void WiFiDisplayMediaPipeline::OnEncodedVideoFrame(
135 const WiFiDisplayEncodedFrame& frame) {
136 DCHECK(packetizer_);
137 if (!packetizer_->EncodeElementaryStreamUnit(
138 0u, frame.bytes(), frame.data.size(), frame.key_frame, frame.pts,
139 frame.dts, true)) {
140 DVLOG(1) << "Couldn't write video mpegts packet";
141 }
142 }
143
144 bool WiFiDisplayMediaPipeline::OnPacketizedMediaDatagramPacket(
145 WiFiDisplayMediaDatagramPacket media_datagram_packet) {
146 NOTIMPLEMENTED();
147 return true;
148 }
149
150 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698