/*
 *  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 tee3.webrtc;

import java.util.Arrays;
import java.util.LinkedHashSet;

import javax.annotation.Nullable;

import cn.tee3.avd.AVDEngine;

public class DefaultVideoDecoderFactory implements VideoDecoderFactory {
  private static final String TAG = "DefaultVideoDecoderFactory";
  private final HardwareVideoDecoderFactory hardwareVideoDecoderFactory;
  private final SoftwareVideoDecoderFactory softwareVideoDecoderFactory;

  public DefaultVideoDecoderFactory(EglBase.Context eglContext) {
    hardwareVideoDecoderFactory =
        new HardwareVideoDecoderFactory(eglContext, false /* fallbackToSoftware */);
    softwareVideoDecoderFactory = new SoftwareVideoDecoderFactory();
  }

  @Override
  public @Nullable VideoDecoder createDecoder(String codecType) {

    String string = AVDEngine.instance().getOption(AVDEngine.Option.eo_video_codec_hw_decode);
    if ("true".equals(string)){
      VideoDecoder decoder = hardwareVideoDecoderFactory.createDecoder(codecType);
      if (decoder != null) {
        Logging.d(TAG, "createDecoder hardware: "+ codecType);
        return decoder;
      }
    }
    Logging.d(TAG, "createDecoder software: "+ codecType);
    return softwareVideoDecoderFactory.createDecoder(codecType);
  }

  @Override
  public VideoCodecInfo[] getSupportedCodecs() {
    LinkedHashSet<VideoCodecInfo> supportedCodecInfos = new LinkedHashSet<VideoCodecInfo>();

    supportedCodecInfos.addAll(Arrays.asList(softwareVideoDecoderFactory.getSupportedCodecs()));
    VideoCodecInfo[] codecs = hardwareVideoDecoderFactory.getSupportedCodecs();
    for (VideoCodecInfo videoCodecInfo : codecs) {
      if ("H264".equals(videoCodecInfo.name) && !VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1.equals(videoCodecInfo.params.get(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID))) {
        supportedCodecInfos.add(videoCodecInfo);
      }
      else if("H265".equals(videoCodecInfo.name)) {
        supportedCodecInfos.add(videoCodecInfo);
      }
    }
    return supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]);
  }
}