/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef WMFDATAENCODERUTILS_H_
#define WMFDATAENCODERUTILS_H_
#include <mfapi.h>

#include "AnnexB.h"
#include "EncoderConfig.h"
#include "H264.h"
#include "MediaCodecsSupport.h"
#include "WMF.h"
#include "libyuv.h"
#include "mozilla/Logging.h"
#include "mozilla/mscom/EnsureMTA.h"

#define WMF_ENC_LOGD(arg, ...)                                                 \
  MOZ_LOG_FMT(mozilla::sPEMLog, mozilla::LogLevel::Debug,                      \
              "WMFMediaDataEncoder(0x{})::{}: " arg, fmt::ptr(this), __func__, \
              ##__VA_ARGS__)
#define WMF_ENC_LOGE(arg, ...)                                                 \
  MOZ_LOG_FMT(mozilla::sPEMLog, mozilla::LogLevel::Error,                      \
              "WMFMediaDataEncoder(0x{})::{}: " arg, fmt::ptr(this), __func__, \
              ##__VA_ARGS__)
#define WMF_ENC_SLOGE(arg, ...)                           \
  MOZ_LOG_FMT(mozilla::sPEMLog, mozilla::LogLevel::Error, \
              "WMFMediaDataEncoder: {}" arg, __func__, ##__VA_ARGS__)

namespace mozilla {

class MFTEncoder;

extern LazyLogModule sPEMLog;

GUID CodecToSubtype(CodecType aCodec);

media::EncodeSupportSet CanCreateWMFEncoder(const EncoderConfig& aConfig);

already_AddRefed<MediaByteBuffer> ParseH264Parameters(
    const nsTArray<uint8_t>& aHeader, const bool aAsAnnexB);
uint32_t GetProfile(H264_PROFILE aProfileLevel);

already_AddRefed<IMFMediaType> CreateInputType(EncoderConfig& aConfig);

already_AddRefed<IMFMediaType> CreateOutputType(EncoderConfig& aConfig);

HRESULT SetMediaTypes(RefPtr<MFTEncoder>& aEncoder, EncoderConfig& aConfig);

}  // namespace mozilla

#endif  // WMFDATAENCODERUTILS_H_
