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