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

Unified Diff: extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc

Issue 1905243003: [chrome.displaySource] Integrate audio encoders into media pipeline. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: 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 side-by-side diff with in-line comments
Download patch
Index: extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc
diff --git a/extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc b/extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc
index 1b3d4b12d7349efb3bb59762844292736a4e40ad..67472fd0be0d1f3907e211264bc2902b59d08006 100644
--- a/extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc
+++ b/extensions/renderer/api/display_source/wifi_display/wifi_display_media_pipeline.cc
@@ -7,13 +7,12 @@
#include "base/logging.h"
#include "content/public/renderer/render_thread.h"
#include "content/public/renderer/video_encode_accelerator.h"
-#include "extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_descriptor.h"
-#include "extensions/renderer/api/display_source/wifi_display/wifi_display_elementary_stream_info.h"
namespace extensions {
namespace {
+const char kErrorAudioEncoderError[] = "Unrepairable audio encoder error";
const char kErrorVideoEncoderError[] = "Unrepairable video encoder error";
const char kErrorUnableSendMedia[] = "Unable to send media";
@@ -73,15 +72,16 @@ void WiFiDisplayMediaPipeline::RequestIDRPicture() {
enum WiFiDisplayMediaPipeline::InitializationStep : unsigned {
INITIALIZE_FIRST,
- INITIALIZE_MEDIA_PACKETIZER = INITIALIZE_FIRST,
+ INITIALIZE_AUDIO_ENCODER = INITIALIZE_FIRST,
INITIALIZE_VIDEO_ENCODER,
+ INITIALIZE_MEDIA_PACKETIZER,
INITIALIZE_MEDIA_SERVICE,
INITIALIZE_LAST = INITIALIZE_MEDIA_SERVICE
};
void WiFiDisplayMediaPipeline::Initialize(
const InitCompletionCallback& callback) {
- DCHECK(!video_encoder_ && !packetizer_);
+ DCHECK(!audio_encoder_ && !video_encoder_ && !packetizer_);
OnInitialize(callback, INITIALIZE_FIRST, true);
}
@@ -103,10 +103,16 @@ void WiFiDisplayMediaPipeline::OnInitialize(
}
switch (current_step) {
- case INITIALIZE_MEDIA_PACKETIZER:
- DCHECK(!packetizer_);
- CreateMediaPacketizer();
- init_step_callback.Run(true);
+ case INITIALIZE_AUDIO_ENCODER:
+ DCHECK(!audio_encoder_);
+ if (type_ & wds::AudioSession) {
+ auto result_callback =
+ base::Bind(&WiFiDisplayMediaPipeline::OnAudioEncoderCreated,
+ weak_factory_.GetWeakPtr(), init_step_callback);
+ WiFiDisplayAudioEncoder::Create(audio_codec_, result_callback);
+ } else {
+ init_step_callback.Run(true);
+ }
break;
case INITIALIZE_VIDEO_ENCODER:
DCHECK(!video_encoder_);
@@ -119,6 +125,11 @@ void WiFiDisplayMediaPipeline::OnInitialize(
init_step_callback.Run(true);
}
break;
+ case INITIALIZE_MEDIA_PACKETIZER:
+ DCHECK(!packetizer_);
+ CreateMediaPacketizer();
+ init_step_callback.Run(true);
+ break;
case INITIALIZE_MEDIA_SERVICE:
service_callback_.Run(
mojo::GetProxy(&media_service_),
@@ -140,19 +151,8 @@ void WiFiDisplayMediaPipeline::CreateMediaPacketizer() {
}
if (type_ & wds::AudioSession) {
- using LPCMAudioStreamDescriptor =
- WiFiDisplayElementaryStreamDescriptor::LPCMAudioStream;
- std::vector<WiFiDisplayElementaryStreamDescriptor> descriptors;
- descriptors.emplace_back(
- LPCMAudioStreamDescriptor::Create(
- audio_codec_.modes.test(wds::LPCM_48K_16B_2CH)
- ? LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_48K
- : LPCMAudioStreamDescriptor::SAMPLING_FREQUENCY_44_1K,
- LPCMAudioStreamDescriptor::BITS_PER_SAMPLE_16,
- false, // emphasis_flag
- LPCMAudioStreamDescriptor::NUMBER_OF_CHANNELS_STEREO));
- stream_infos.emplace_back(WiFiDisplayElementaryStreamInfo::AUDIO_LPCM,
- std::move(descriptors));
+ DCHECK(audio_encoder_);
+ stream_infos.push_back(audio_encoder_->CreateElementaryStreamInfo());
}
packetizer_.reset(new WiFiDisplayMediaPacketizer(
@@ -162,6 +162,26 @@ void WiFiDisplayMediaPipeline::CreateMediaPacketizer() {
base::Unretained(this))));
}
+void WiFiDisplayMediaPipeline::OnAudioEncoderCreated(
+ const InitStepCompletionCallback& callback,
+ scoped_refptr<WiFiDisplayAudioEncoder> audio_encoder) {
+ DCHECK(!audio_encoder_);
+
+ if (!audio_encoder) {
+ callback.Run(false);
+ return;
+ }
+
+ audio_encoder_ = std::move(audio_encoder);
+ auto encoded_callback =
+ base::Bind(&WiFiDisplayMediaPipeline::OnEncodedAudioUnit,
+ weak_factory_.GetWeakPtr());
+ auto error_callback = base::Bind(error_callback_, kErrorAudioEncoderError);
+ audio_encoder_->SetCallbacks(encoded_callback, error_callback);
+
+ callback.Run(true);
+}
+
void WiFiDisplayMediaPipeline::OnVideoEncoderCreated(
const InitStepCompletionCallback& callback,
scoped_refptr<WiFiDisplayVideoEncoder> video_encoder) {
@@ -193,6 +213,17 @@ void WiFiDisplayMediaPipeline::OnMediaServiceRegistered(
callback);
}
+void WiFiDisplayMediaPipeline::OnEncodedAudioUnit(
+ std::unique_ptr<WiFiDisplayEncodedFrame> unit) {
+ DCHECK(packetizer_);
+ const unsigned stream_index = (type_ & wds::VideoSession) ? 1u : 0u;
+ if (!packetizer_->EncodeElementaryStreamUnit(stream_index, unit->bytes(),
+ unit->size(), unit->key_frame,
+ unit->pts, unit->dts, true)) {
+ DVLOG(1) << "Couldn't write audio mpegts packet";
+ }
+}
+
void WiFiDisplayMediaPipeline::OnEncodedVideoFrame(
std::unique_ptr<WiFiDisplayEncodedFrame> frame) {
DCHECK(packetizer_);

Powered by Google App Engine
This is Rietveld 408576698