| Index: content/renderer/media/media_recorder_handler.cc
|
| diff --git a/content/renderer/media/media_recorder_handler.cc b/content/renderer/media/media_recorder_handler.cc
|
| index 6b8b0541cc10748f740225738f4d063c7b124a7a..9a2c21096f2d149706e7121b826668af3c56a351 100644
|
| --- a/content/renderer/media/media_recorder_handler.cc
|
| +++ b/content/renderer/media/media_recorder_handler.cc
|
| @@ -16,6 +16,7 @@
|
| #include "media/audio/audio_parameters.h"
|
| #include "media/base/audio_bus.h"
|
| #include "media/base/bind_to_current_loop.h"
|
| +#include "media/base/mime_util.h"
|
| #include "media/base/video_frame.h"
|
| #include "media/capture/webm_muxer.h"
|
| #include "third_party/WebKit/public/platform/WebMediaRecorderHandlerClient.h"
|
| @@ -40,42 +41,57 @@ MediaRecorderHandler::~MediaRecorderHandler() {
|
| }
|
|
|
| bool MediaRecorderHandler::canSupportMimeType(
|
| - const blink::WebString& mimeType) {
|
| + const blink::WebString& web_type, const blink::WebString& web_codecs) {
|
| DCHECK(main_render_thread_checker_.CalledOnValidThread());
|
| - // Ensure we can support each passed MIME type.
|
| - const std::string input = mimeType.utf8(); // Must outlive tokenizer!
|
| - base::StringTokenizer tokenizer(input, ",");
|
| - while (tokenizer.GetNext()) {
|
| - // Strip whitespace.
|
| - const std::string token(base::CollapseWhitespaceASCII(
|
| - tokenizer.token(), true /* trim sequences with line breaks*/));
|
| - if (!token.empty() &&
|
| - !base::EqualsCaseInsensitiveASCII(token, "video/vp8") &&
|
| - !base::EqualsCaseInsensitiveASCII(token, "video/vp9") &&
|
| - !base::EqualsCaseInsensitiveASCII(token, "audio/opus") &&
|
| - !base::EqualsCaseInsensitiveASCII(token, "video/webm") &&
|
| - !base::EqualsCaseInsensitiveASCII(token, "audio/webm")) {
|
| + // An empty |web_type| means MediaRecorderHandler can choose its preferred
|
| + // codecs.
|
| + if (web_type.isEmpty())
|
| + return true;
|
| +
|
| + const std::string type(web_type.utf8());
|
| + const bool video = base::EqualsCaseInsensitiveASCII(type, "video/webm");
|
| + const bool audio =
|
| + video ? false : base::EqualsCaseInsensitiveASCII(type, "audio/webm");
|
| + if (!video && !audio)
|
| + return false;
|
| +
|
| + // Both |video| and |audio| support empty |codecs|; |type| == "video" supports
|
| + // vp8, vp9 or opus; |type| = "audio", supports only opus.
|
| + // http://www.webmproject.org/docs/container Sec:"HTML5 Video Type Parameters"
|
| + static const char* kVideoCodecs[] = { "vp8", "vp9", "opus" };
|
| + static const char* kAudioCodecs[] = { "opus" };
|
| + const char** codecs = video ? &kVideoCodecs[0] : &kAudioCodecs[0];
|
| + int codecs_count = video ? arraysize(kVideoCodecs) : arraysize(kAudioCodecs);
|
| +
|
| + std::vector<std::string> codecs_list;
|
| + media::ParseCodecString(web_codecs.utf8(), &codecs_list, true /* strip */);
|
| + for (const auto& codec : codecs_list) {
|
| + const auto found = std::find_if(
|
| + &codecs[0], &codecs[codecs_count], [&codec](const char* name) {
|
| + return base::EqualsCaseInsensitiveASCII(codec, name);
|
| + });
|
| + if (found == &codecs[codecs_count])
|
| return false;
|
| - }
|
| }
|
| -
|
| return true;
|
| }
|
|
|
| bool MediaRecorderHandler::initialize(
|
| blink::WebMediaRecorderHandlerClient* client,
|
| const blink::WebMediaStream& media_stream,
|
| - const blink::WebString& mimeType) {
|
| + const blink::WebString& type,
|
| + const blink::WebString& codecs) {
|
| DCHECK(main_render_thread_checker_.CalledOnValidThread());
|
| // Save histogram data so we can see how much MediaStream Recorder is used.
|
| // The histogram counts the number of calls to the JS API.
|
| UpdateWebRTCMethodCount(WEBKIT_MEDIA_STREAM_RECORDER);
|
|
|
| - if (!canSupportMimeType(mimeType)) {
|
| - DLOG(ERROR) << "Can't support type " << mimeType.utf8();
|
| + if (!canSupportMimeType(type, codecs)) {
|
| + DLOG(ERROR) << "Can't support " << type.utf8()
|
| + << ";codecs=" << codecs.utf8();
|
| return false;
|
| }
|
| - use_vp9_ = mimeType.utf8().compare("video/vp9") == 0;
|
| + use_vp9_ = base::ToLowerASCII(codecs.utf8()).find("vp9") != std::string::npos;
|
| media_stream_ = media_stream;
|
| DCHECK(client);
|
| client_ = client;
|
|
|