/*
 *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.webrtc;

import androidx.annotation.Nullable;
import java.util.Arrays;
import java.util.Locale;
import java.util.Map;

/**
 * Represent a video codec as encoded in SDP.
 */
public class VideoCodecInfo {
  // Keys for H264 VideoCodecInfo properties.
  public static final String H264_FMTP_PROFILE_LEVEL_ID = "profile-level-id";
  public static final String H264_FMTP_LEVEL_ASYMMETRY_ALLOWED = "level-asymmetry-allowed";
  public static final String H264_FMTP_PACKETIZATION_MODE = "packetization-mode";

  public static final String H264_PROFILE_CONSTRAINED_BASELINE = "42e0";
  public static final String H264_PROFILE_CONSTRAINED_HIGH = "640c";
  public static final String H264_LEVEL_3_1 = "1f"; // 31 in hex.
  public static final String H264_CONSTRAINED_HIGH_3_1 =
      H264_PROFILE_CONSTRAINED_HIGH + H264_LEVEL_3_1;
  public static final String H264_CONSTRAINED_BASELINE_3_1 =
      H264_PROFILE_CONSTRAINED_BASELINE + H264_LEVEL_3_1;

  public final String name;
  public final Map<String, String> params;
  @Deprecated public final int payload;

  @CalledByNative
  public VideoCodecInfo(String name, Map<String, String> params) {
    this.payload = 0;
    this.name = name;
    this.params = params;
  }

  @Deprecated
  public VideoCodecInfo(int payload, String name, Map<String, String> params) {
    this.payload = payload;
    this.name = name;
    this.params = params;
  }

  @Override
  public boolean equals(@Nullable Object obj) {
    if (obj == null)
      return false;
    if (obj == this)
      return true;
    if (!(obj instanceof VideoCodecInfo))
      return false;

    VideoCodecInfo otherInfo = (VideoCodecInfo) obj;
    return name.equalsIgnoreCase(otherInfo.name) && params.equals(otherInfo.params);
  }

  @Override
  public int hashCode() {
    Object[] values = {name.toUpperCase(Locale.ROOT), params};
    return Arrays.hashCode(values);
  }

  @Override
  public String toString() {
    return "VideoCodec{" + name + " " + params + "}";
  }

  @CalledByNative
  String getName() {
    return name;
  }

  @CalledByNative
  Map getParams() {
    return params;
  }
}
