/*
 * Copyright 2016 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_MEDIA_BASE_VIDEO_RESOLUTION_H_
#define COBALT_MEDIA_BASE_VIDEO_RESOLUTION_H_

#include "ui/gfx/size.h"

namespace cobalt {
namespace media {

// Enumerates the various representations of the resolution of videos.  Note
// that except |kVideoResolutionInvalid|, all other values are guaranteed to be
// in the same order as its (width, height) pair.
enum VideoResolution {
  kVideoResolution1080p,  // 1920 x 1080
  kVideoResolution2k,     // 2560 x 1440
  kVideoResolution4k,     // 3840 x 2160
  kVideoResolutionInvalid
};

inline VideoResolution GetVideoResolution(int width, int height) {
  if (width <= 1920 && height <= 1080) {
    return kVideoResolution1080p;
  }
  if (width <= 2560 && height <= 1440) {
    return kVideoResolution2k;
  }
  if (width <= 3840 && height <= 2160) {
    return kVideoResolution4k;
  }
  return kVideoResolutionInvalid;
}

inline VideoResolution GetVideoResolution(const gfx::Size& size) {
  return GetVideoResolution(size.width(), size.height());
}

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_BASE_VIDEO_RESOLUTION_H_
