/*
 *  Copyright (c) 2021 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.
 *
 */

#import <Foundation/Foundation.h>

#import "RTCNativeVideoDecoder.h"
#import "RTCNativeVideoDecoderBuilder+Native.h"
#import "RTCVideoDecoderAV1.h"
#import "api/peerconnection/RTCVideoCodecInfo+Private.h"
#import "sdk/objc/base/RTCMacros.h"

#include "api/video_codecs/sdp_video_format.h"
#include "modules/video_coding/codecs/av1/dav1d_decoder.h"

@interface RTC_OBJC_TYPE (RTCVideoDecoderAV1Builder)
    : RTC_OBJC_TYPE(RTCNativeVideoDecoder) <RTC_OBJC_TYPE (RTCNativeVideoDecoderBuilder)>
@end

    @implementation RTC_OBJC_TYPE (RTCVideoDecoderAV1Builder)

    - (std::unique_ptr<webrtc::VideoDecoder>)build:
        (const webrtc::Environment &)env {
      return webrtc::CreateDav1dDecoder(env);
    }

    - (std::unique_ptr<webrtc::VideoDecoder>)
        buildWithEnvironment:(const webrtc::Environment &)env
                      format:(const webrtc::SdpVideoFormat &)format {
      return webrtc::CreateDav1dDecoder(env);
    }

    @end

    @implementation RTC_OBJC_TYPE (RTCVideoDecoderAV1)

    + (id<RTC_OBJC_TYPE(RTCVideoDecoder)>)av1Decoder {
      return [[RTC_OBJC_TYPE(RTCVideoDecoderAV1Builder) alloc] init];
    }

    + (NSArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *)supportedCodecs {
      return @[ [[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc]
          initWithNativeSdpVideoFormat:webrtc::SdpVideoFormat::AV1Profile0()] ];
    }

    @end
