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

#ifndef MEDIA_ENGINE_WEBRTC_VIDEO_DECODER_FACTORY_H_
#define MEDIA_ENGINE_WEBRTC_VIDEO_DECODER_FACTORY_H_

#include <string>

#include "api/video/video_codec_type.h"
#include "media/base/codec.h"
#include "rtc_base/ref_count.h"
#include "rtc_base/system/rtc_export.h"

namespace webrtc {
class VideoDecoder;
}

namespace cricket {

struct VideoDecoderParams {
  std::string receive_stream_id;
};

// Deprecated. Use webrtc::VideoDecoderFactory instead.
// https://bugs.chromium.org/p/webrtc/issues/detail?id=7925
class RTC_EXPORT WebRtcVideoDecoderFactory {
 public:
  // Caller takes the ownership of the returned object and it should be released
  // by calling DestroyVideoDecoder().
  virtual webrtc::VideoDecoder* CreateVideoDecoderWithParams(
      const VideoCodec& codec,
      VideoDecoderParams params);

  // DEPRECATED.
  // These methods should not be used by new code and will eventually be
  // removed. See http://crbug.com/webrtc/8140.
  virtual webrtc::VideoDecoder* CreateVideoDecoder(webrtc::VideoCodecType type);

  virtual webrtc::VideoDecoder* CreateVideoDecoderWithParams(
      webrtc::VideoCodecType type,
      VideoDecoderParams params);

  virtual ~WebRtcVideoDecoderFactory() {}

  virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) = 0;
};

}  // namespace cricket

#endif  // MEDIA_ENGINE_WEBRTC_VIDEO_DECODER_FACTORY_H_
