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