summaryrefslogtreecommitdiff
path: root/chromium/media/blink/webmediacapabilitiesclient_impl.cc
blob: d973d2f6314264c639b3d65a88efd7a8d180e2e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/blink/webmediacapabilitiesclient_impl.h"

#include "media/base/audio_codecs.h"
#include "media/base/decode_capabilities.h"
#include "media/base/mime_util.h"
#include "media/base/video_codecs.h"
#include "media/base/video_color_space.h"
#include "third_party/WebKit/public/platform/modules/media_capabilities/WebAudioConfiguration.h"
#include "third_party/WebKit/public/platform/modules/media_capabilities/WebMediaCapabilitiesInfo.h"
#include "third_party/WebKit/public/platform/modules/media_capabilities/WebMediaConfiguration.h"
#include "third_party/WebKit/public/platform/modules/media_capabilities/WebVideoConfiguration.h"

namespace media {

WebMediaCapabilitiesClientImpl::WebMediaCapabilitiesClientImpl() = default;

WebMediaCapabilitiesClientImpl::~WebMediaCapabilitiesClientImpl() = default;

void WebMediaCapabilitiesClientImpl::DecodingInfo(
    const blink::WebMediaConfiguration& configuration,
    std::unique_ptr<blink::WebMediaCapabilitiesQueryCallbacks> callbacks) {
  std::unique_ptr<blink::WebMediaCapabilitiesInfo> info(
      new blink::WebMediaCapabilitiesInfo());

  bool audio_supported = true;
  bool video_supported = true;

  if (configuration.audio_configuration) {
    const blink::WebAudioConfiguration& audio_config =
        configuration.audio_configuration.value();
    AudioCodec audio_codec;
    bool is_audio_codec_ambiguous;

    if (!ParseAudioCodecString(audio_config.mime_type.Ascii(),
                               audio_config.codec.Ascii(),
                               &is_audio_codec_ambiguous, &audio_codec)) {
      // TODO(chcunningham): Replace this and other DVLOGs here with MEDIA_LOG.
      // MediaCapabilities may need its own tab in chrome://media-internals.
      DVLOG(2) << __func__ << " Failed to parse audio codec string:"
               << audio_config.codec.Ascii();
      audio_supported = false;
    } else if (is_audio_codec_ambiguous) {
      DVLOG(2) << __func__ << " Invalid (ambiguous) audio codec string:"
               << audio_config.codec.Ascii();
      audio_supported = false;
    } else {
      AudioConfig audio_config = {audio_codec};
      audio_supported = IsSupportedAudioConfig(audio_config);
    }
  }

  if (configuration.video_configuration) {
    const blink::WebVideoConfiguration& video_config =
        configuration.video_configuration.value();
    VideoCodec video_codec;
    VideoCodecProfile video_profile;
    uint8_t video_level;
    VideoColorSpace video_color_space;
    bool is_video_codec_ambiguous;

    if (!ParseVideoCodecString(
            video_config.mime_type.Ascii(), video_config.codec.Ascii(),
            &is_video_codec_ambiguous, &video_codec, &video_profile,
            &video_level, &video_color_space)) {
      DVLOG(2) << __func__ << " Failed to parse video codec string:"
               << video_config.codec.Ascii();
      video_supported = false;
    } else if (is_video_codec_ambiguous) {
      DVLOG(2) << __func__ << " Invalid (ambiguous) video codec string:"
               << video_config.codec.Ascii();
      video_supported = false;
    } else {
      VideoConfig video_config = {video_codec, video_profile, video_level,
                                  video_color_space};
      video_supported = IsSupportedVideoConfig(video_config);
    }
  }

  info->supported = audio_supported && video_supported;

  // TODO(chcunningham, mlamouri): real implementation for these.
  info->smooth = info->power_efficient = info->supported;

  callbacks->OnSuccess(std::move(info));
}

}  // namespace media