decrypting_video_decoder.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_ 6#define MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_ 7 8#include "base/callback.h" 9#include "base/memory/weak_ptr.h" 10#include "media/base/decryptor.h" 11#include "media/base/video_decoder.h" 12#include "media/base/video_decoder_config.h" 13 14namespace base { 15class SingleThreadTaskRunner; 16} 17 18namespace media { 19 20class DecoderBuffer; 21class Decryptor; 22 23// Decryptor-based VideoDecoder implementation that can decrypt and decode 24// encrypted video buffers and return decrypted and decompressed video frames. 25// All public APIs and callbacks are trampolined to the |task_runner_| so 26// that no locks are required for thread safety. 27class MEDIA_EXPORT DecryptingVideoDecoder : public VideoDecoder { 28 public: 29 DecryptingVideoDecoder( 30 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 31 const SetDecryptorReadyCB& set_decryptor_ready_cb); 32 virtual ~DecryptingVideoDecoder(); 33 34 // VideoDecoder implementation. 35 virtual void Initialize(const VideoDecoderConfig& config, 36 const PipelineStatusCB& status_cb) OVERRIDE; 37 virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer, 38 const DecodeCB& decode_cb) OVERRIDE; 39 virtual void Reset(const base::Closure& closure) OVERRIDE; 40 virtual void Stop(const base::Closure& closure) OVERRIDE; 41 42 private: 43 // For a detailed state diagram please see this link: http://goo.gl/8jAok 44 // TODO(xhwang): Add a ASCII state diagram in this file after this class 45 // stabilizes. 46 enum State { 47 kUninitialized = 0, 48 kDecryptorRequested, 49 kPendingDecoderInit, 50 kIdle, 51 kPendingDecode, 52 kWaitingForKey, 53 kDecodeFinished, 54 kStopped, 55 kError 56 }; 57 58 // Callback for DecryptorHost::RequestDecryptor(). 59 void SetDecryptor(Decryptor* decryptor); 60 61 // Callback for Decryptor::InitializeVideoDecoder() during initialization. 62 void FinishInitialization(bool success); 63 64 void DecodePendingBuffer(); 65 66 // Callback for Decryptor::DecryptAndDecodeVideo(). 67 void DeliverFrame(int buffer_size, 68 Decryptor::Status status, 69 const scoped_refptr<VideoFrame>& frame); 70 71 // Callback for the |decryptor_| to notify this object that a new key has been 72 // added. 73 void OnKeyAdded(); 74 75 // Reset decoder and call |reset_cb_|. 76 void DoReset(); 77 78 // Free decoder resources and call |stop_cb_|. 79 void DoStop(); 80 81 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 82 base::WeakPtrFactory<DecryptingVideoDecoder> weak_factory_; 83 base::WeakPtr<DecryptingVideoDecoder> weak_this_; 84 85 State state_; 86 87 PipelineStatusCB init_cb_; 88 DecodeCB decode_cb_; 89 base::Closure reset_cb_; 90 91 VideoDecoderConfig config_; 92 93 // Callback to request/cancel decryptor creation notification. 94 SetDecryptorReadyCB set_decryptor_ready_cb_; 95 96 Decryptor* decryptor_; 97 98 // The buffer that needs decrypting/decoding. 99 scoped_refptr<media::DecoderBuffer> pending_buffer_to_decode_; 100 101 // Indicates the situation where new key is added during pending decode 102 // (in other words, this variable can only be set in state kPendingDecode). 103 // If this variable is true and kNoKey is returned then we need to try 104 // decrypting/decoding again in case the newly added key is the correct 105 // decryption key. 106 bool key_added_while_decode_pending_; 107 108 // A unique ID to trace Decryptor::DecryptAndDecodeVideo() call and the 109 // matching DecryptCB call (in DoDeliverFrame()). 110 uint32 trace_id_; 111 112 DISALLOW_COPY_AND_ASSIGN(DecryptingVideoDecoder); 113}; 114 115} // namespace media 116 117#endif // MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_ 118