1776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org/*
2776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org *
4776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org *  Use of this source code is governed by a BSD-style license
5776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org *  that can be found in the LICENSE file in the root of the source
6776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org *  tree. An additional intellectual property rights grant can be found
7776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org *  in the file PATENTS.  All contributing project authors may
8776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org */
10776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
11776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#ifndef WEBRTC_VIDEO_DECODER_H_
12776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#define WEBRTC_VIDEO_DECODER_H_
13776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
14b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström#include <string>
15776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#include <vector>
16776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
17776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#include "webrtc/common_types.h"
18776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#include "webrtc/typedefs.h"
19776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#include "webrtc/video_frame.h"
20776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
21776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgnamespace webrtc {
22776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
23776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgclass RTPFragmentationHeader;
24776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org// TODO(pbos): Expose these through a public (root) header or change these APIs.
25776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgstruct CodecSpecificInfo;
26776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgstruct VideoCodec;
27776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
28776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgclass DecodedImageCallback {
29776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org public:
30776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual ~DecodedImageCallback() {}
31776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
324765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez  virtual int32_t Decoded(VideoFrame& decodedImage) = 0;
33327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // Provides an alternative interface that allows the decoder to specify the
34327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // decode time excluding waiting time for any previous pending frame to
35327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // return. This is necessary for breaking positive feedback in the delay
36327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // estimation when the decoder has a single output buffer.
37327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // TODO(perkj): Remove default implementation when chromium has been updated.
38327d8babc81913410dbb3125a62be3ff0e46e9f4Per  virtual int32_t Decoded(VideoFrame& decodedImage, int64_t decode_time_ms) {
39327d8babc81913410dbb3125a62be3ff0e46e9f4Per    // The default implementation ignores custom decode time value.
40327d8babc81913410dbb3125a62be3ff0e46e9f4Per    return Decoded(decodedImage);
41327d8babc81913410dbb3125a62be3ff0e46e9f4Per  }
42327d8babc81913410dbb3125a62be3ff0e46e9f4Per
43776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId) {
44776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org    return -1;
45776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  }
46776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
47776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t ReceivedDecodedFrame(const uint64_t pictureId) { return -1; }
48776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org};
49776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
50776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgclass VideoDecoder {
51776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org public:
52776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  enum DecoderType {
5371f6f4405c1c5f60097f8d10841378088e78e8b9Zeke Chin    kH264,
54776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org    kVp8,
557252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström    kVp9,
567252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström    kUnsupportedCodec,
57776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  };
58776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
59776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  static VideoDecoder* Create(DecoderType codec_type);
60776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
61776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual ~VideoDecoder() {}
62776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
637252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  virtual int32_t InitDecode(const VideoCodec* codec_settings,
647252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                             int32_t number_of_cores) = 0;
65776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
667252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  virtual int32_t Decode(const EncodedImage& input_image,
677252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                         bool missing_frames,
68776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org                         const RTPFragmentationHeader* fragmentation,
697252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                         const CodecSpecificInfo* codec_specific_info = NULL,
707252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                         int64_t render_time_ms = -1) = 0;
71776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
72776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t RegisterDecodeCompleteCallback(
73776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org      DecodedImageCallback* callback) = 0;
74776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
75776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t Release() = 0;
76776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t Reset() = 0;
77796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj
78796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj  // Returns true if the decoder prefer to decode frames late.
79796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj  // That is, it can not decode infinite number of frames before the decoded
80796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj  // frame is consumed.
81796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj  virtual bool PrefersLateDecoding() const { return true; }
82b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström
83b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström  virtual const char* ImplementationName() const { return "unknown"; }
84776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org};
85776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
867252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström// Class used to wrap external VideoDecoders to provide a fallback option on
877252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström// software decoding when a hardware decoder fails to decode a stream due to
887252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström// hardware restrictions, such as max resolution.
897252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boströmclass VideoDecoderSoftwareFallbackWrapper : public webrtc::VideoDecoder {
907252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström public:
917252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  VideoDecoderSoftwareFallbackWrapper(VideoCodecType codec_type,
927252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                                      VideoDecoder* decoder);
937252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
947252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t InitDecode(const VideoCodec* codec_settings,
957252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                     int32_t number_of_cores) override;
967252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
977252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t Decode(const EncodedImage& input_image,
987252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                 bool missing_frames,
997252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                 const RTPFragmentationHeader* fragmentation,
1007252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                 const CodecSpecificInfo* codec_specific_info,
1017252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                 int64_t render_time_ms) override;
1027252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
1037252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t RegisterDecodeCompleteCallback(
1047252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström      DecodedImageCallback* callback) override;
1057252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
1067252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t Release() override;
1077252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t Reset() override;
108796cfaf7f76aa740cc7f4bb2c94f88637e475324perkj  bool PrefersLateDecoding() const override;
1097252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
110b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström  const char* ImplementationName() const override;
111b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström
1127252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström private:
1137252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  bool InitFallbackDecoder();
1147252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
1157252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  const DecoderType decoder_type_;
1167252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  VideoDecoder* const decoder_;
1177252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
1187252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  VideoCodec codec_settings_;
1197252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t number_of_cores_;
120b7d9a97ce41022e984348efb5f28bf6dd6c6b779Peter Boström  std::string fallback_implementation_name_;
1217252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  rtc::scoped_ptr<VideoDecoder> fallback_decoder_;
1227252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  DecodedImageCallback* callback_;
1237252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström};
1247252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
125776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org}  // namespace webrtc
126776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
127776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#endif  // WEBRTC_VIDEO_DECODER_H_
128