video_decoder.h revision 327d8babc81913410dbb3125a62be3ff0e46e9f4
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
14776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#include <vector>
15776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
16776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#include "webrtc/common_types.h"
17776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#include "webrtc/typedefs.h"
18776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#include "webrtc/video_frame.h"
19776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
20776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgnamespace webrtc {
21776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
22776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgclass RTPFragmentationHeader;
23776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org// TODO(pbos): Expose these through a public (root) header or change these APIs.
24776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgstruct CodecSpecificInfo;
25776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgstruct VideoCodec;
26776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
27776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgclass DecodedImageCallback {
28776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org public:
29776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual ~DecodedImageCallback() {}
30776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
314765070b8d6f024509c717c04d9b708750666927Miguel Casas-Sanchez  virtual int32_t Decoded(VideoFrame& decodedImage) = 0;
32327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // Provides an alternative interface that allows the decoder to specify the
33327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // decode time excluding waiting time for any previous pending frame to
34327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // return. This is necessary for breaking positive feedback in the delay
35327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // estimation when the decoder has a single output buffer.
36327d8babc81913410dbb3125a62be3ff0e46e9f4Per  // TODO(perkj): Remove default implementation when chromium has been updated.
37327d8babc81913410dbb3125a62be3ff0e46e9f4Per  virtual int32_t Decoded(VideoFrame& decodedImage, int64_t decode_time_ms) {
38327d8babc81913410dbb3125a62be3ff0e46e9f4Per    // The default implementation ignores custom decode time value.
39327d8babc81913410dbb3125a62be3ff0e46e9f4Per    return Decoded(decodedImage);
40327d8babc81913410dbb3125a62be3ff0e46e9f4Per  }
41327d8babc81913410dbb3125a62be3ff0e46e9f4Per
42776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId) {
43776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org    return -1;
44776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  }
45776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
46776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t ReceivedDecodedFrame(const uint64_t pictureId) { return -1; }
47776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org};
48776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
49776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.orgclass VideoDecoder {
50776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org public:
51776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  enum DecoderType {
5271f6f4405c1c5f60097f8d10841378088e78e8b9Zeke Chin    kH264,
53776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org    kVp8,
547252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström    kVp9,
557252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström    kUnsupportedCodec,
56776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  };
57776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
58776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  static VideoDecoder* Create(DecoderType codec_type);
59776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
60776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual ~VideoDecoder() {}
61776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
627252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  virtual int32_t InitDecode(const VideoCodec* codec_settings,
637252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                             int32_t number_of_cores) = 0;
64776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
657252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  virtual int32_t Decode(const EncodedImage& input_image,
667252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                         bool missing_frames,
67776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org                         const RTPFragmentationHeader* fragmentation,
687252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                         const CodecSpecificInfo* codec_specific_info = NULL,
697252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                         int64_t render_time_ms = -1) = 0;
70776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
71776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t RegisterDecodeCompleteCallback(
72776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org      DecodedImageCallback* callback) = 0;
73776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
74776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t Release() = 0;
75776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org  virtual int32_t Reset() = 0;
76776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org};
77776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
787252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström// Class used to wrap external VideoDecoders to provide a fallback option on
797252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström// software decoding when a hardware decoder fails to decode a stream due to
807252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström// hardware restrictions, such as max resolution.
817252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boströmclass VideoDecoderSoftwareFallbackWrapper : public webrtc::VideoDecoder {
827252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström public:
837252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  VideoDecoderSoftwareFallbackWrapper(VideoCodecType codec_type,
847252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                                      VideoDecoder* decoder);
857252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
867252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t InitDecode(const VideoCodec* codec_settings,
877252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                     int32_t number_of_cores) override;
887252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
897252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t Decode(const EncodedImage& input_image,
907252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                 bool missing_frames,
917252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                 const RTPFragmentationHeader* fragmentation,
927252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                 const CodecSpecificInfo* codec_specific_info,
937252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström                 int64_t render_time_ms) override;
947252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
957252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t RegisterDecodeCompleteCallback(
967252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström      DecodedImageCallback* callback) override;
977252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
987252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t Release() override;
997252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t Reset() override;
1007252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
1017252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström private:
1027252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  bool InitFallbackDecoder();
1037252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
1047252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  const DecoderType decoder_type_;
1057252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  VideoDecoder* const decoder_;
1067252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
1077252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  VideoCodec codec_settings_;
1087252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  int32_t number_of_cores_;
1097252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  rtc::scoped_ptr<VideoDecoder> fallback_decoder_;
1107252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström  DecodedImageCallback* callback_;
1117252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström};
1127252a2ba8035c4128917a9558a3e34fc9dbe7c44Peter Boström
113776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org}  // namespace webrtc
114776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org
115776e6f289c7396a1143b8b36b03f88b08ac8cba3pbos@webrtc.org#endif  // WEBRTC_VIDEO_DECODER_H_
116