15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef MEDIA_FILTERS_DECODER_SELECTOR_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MEDIA_FILTERS_DECODER_SELECTOR_H_ 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_vector.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/decryptor.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/demuxer_stream.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/pipeline_status.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/filters/decoder_stream_traits.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace base { 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SingleThreadTaskRunner; 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DecoderBuffer; 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DecryptingDemuxerStream; 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Decryptor; 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DecoderSelector (creates if necessary and) initializes the proper 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Decoder for a given DemuxerStream. If the given DemuxerStream is 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// encrypted, a DecryptingDemuxerStream may also be created. 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The template parameter |StreamType| is the type of stream we will be 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// selecting a decoder for. 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template<DemuxerStream::Type StreamType> 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MEDIA_EXPORT DecoderSelector { 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef DecoderStreamTraits<StreamType> StreamTraits; 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef typename StreamTraits::DecoderType Decoder; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Indicates completion of Decoder selection. 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - First parameter: The initialized Decoder. If it's set to NULL, then 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Decoder initialization failed. 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - Second parameter: The initialized DecryptingDemuxerStream. If it's not 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // NULL, then a DecryptingDemuxerStream is created and initialized to do 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // decryption for the initialized Decoder. 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: The caller owns selected Decoder and DecryptingDemuxerStream. 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The caller should call DecryptingDemuxerStream::Reset() before 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // calling Decoder::Reset() to release any pending decryption or read. 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef base::Callback< 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void(scoped_ptr<Decoder>, 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DecryptingDemuxerStream>)> 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SelectDecoderCB; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |decoders| contains the Decoders to use when initializing. 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |set_decryptor_ready_cb| is optional. If |set_decryptor_ready_cb| is null, 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // no decryptor will be available to perform decryption. 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DecoderSelector( 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& message_loop, 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<Decoder> decoders, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SetDecryptorReadyCB& set_decryptor_ready_cb); 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Aborts pending Decoder selection and fires |select_decoder_cb| with 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // NULL and NULL immediately if it's pending. 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ~DecoderSelector(); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Initializes and selects a Decoder that can decode the |stream|. 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Selected Decoder (and DecryptingDemuxerStream) is returned via 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the |select_decoder_cb|. 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SelectDecoder(DemuxerStream* stream, 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool low_delay, 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const SelectDecoderCB& select_decoder_cb, 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const typename Decoder::OutputCB& output_cb); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DecryptingDecoderInitDone(PipelineStatus status); 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DecryptingDemuxerStreamInitDone(PipelineStatus status); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void InitializeDecoder(); 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DecoderInitDone(PipelineStatus status); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ReturnNullDecoder(); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedVector<Decoder> decoders_; 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetDecryptorReadyCB set_decryptor_ready_cb_; 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DemuxerStream* input_stream_; 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool low_delay_; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SelectDecoderCB select_decoder_cb_; 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typename Decoder::OutputCB output_cb_; 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<Decoder> decoder_; 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DecryptingDemuxerStream> decrypted_stream_; 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // NOTE: Weak pointers must be invalidated before all other member variables. 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WeakPtrFactory<DecoderSelector> weak_ptr_factory_; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_IMPLICIT_CONSTRUCTORS(DecoderSelector); 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef DecoderSelector<DemuxerStream::VIDEO> VideoDecoderSelector; 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef DecoderSelector<DemuxerStream::AUDIO> AudioDecoderSelector; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace media 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // MEDIA_FILTERS_DECODER_SELECTOR_H_ 104