15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/weak_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decryptor.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_decoder.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/video_decoder_config.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SingleThreadTaskRunner;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DecoderBuffer;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Decryptor;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Decryptor-based VideoDecoder implementation that can decrypt and decode
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// encrypted video buffers and return decrypted and decompressed video frames.
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// All public APIs and callbacks are trampolined to the |task_runner_| so
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that no locks are required for thread safety.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT DecryptingVideoDecoder : public VideoDecoder {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecryptingVideoDecoder(
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SetDecryptorReadyCB& set_decryptor_ready_cb);
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~DecryptingVideoDecoder();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // VideoDecoder implementation.
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string GetDisplayName() const OVERRIDE;
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Initialize(const VideoDecoderConfig& config,
376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                          bool low_delay,
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          const PipelineStatusCB& status_cb,
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          const OutputCB& output_cb) OVERRIDE;
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                      const DecodeCB& decode_cb) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Reset(const base::Closure& closure) OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For a detailed state diagram please see this link: http://goo.gl/8jAok
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(xhwang): Add a ASCII state diagram in this file after this class
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stabilizes.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum State {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kUninitialized = 0,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kDecryptorRequested,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPendingDecoderInit,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kIdle,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kPendingDecode,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kWaitingForKey,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kDecodeFinished,
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    kError
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Callback for DecryptorHost::RequestDecryptor(). |decryptor_attached_cb| is
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // called when the decryptor has been completely attached to the pipeline.
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void SetDecryptor(Decryptor* decryptor,
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    const DecryptorAttachedCB& decryptor_attached_cb);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callback for Decryptor::InitializeVideoDecoder() during initialization.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishInitialization(bool success);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DecodePendingBuffer();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for Decryptor::DecryptAndDecodeVideo().
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeliverFrame(int buffer_size,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Decryptor::Status status,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const scoped_refptr<VideoFrame>& frame);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callback for the |decryptor_| to notify this object that a new key has been
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // added.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnKeyAdded();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset decoder and call |reset_cb_|.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoReset();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  State state_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatusCB init_cb_;
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  OutputCB output_cb_;
87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DecodeCB decode_cb_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure reset_cb_;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  VideoDecoderConfig config_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback to request/cancel decryptor creation notification.
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDecryptorReadyCB set_decryptor_ready_cb_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Decryptor* decryptor_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The buffer that needs decrypting/decoding.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<media::DecoderBuffer> pending_buffer_to_decode_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates the situation where new key is added during pending decode
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (in other words, this variable can only be set in state kPendingDecode).
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this variable is true and kNoKey is returned then we need to try
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // decrypting/decoding again in case the newly added key is the correct
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // decryption key.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool key_added_while_decode_pending_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A unique ID to trace Decryptor::DecryptAndDecodeVideo() call and the
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matching DecryptCB call (in DoDeliverFrame()).
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 trace_id_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // NOTE: Weak pointers must be invalidated before all other member variables.
11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::WeakPtrFactory<DecryptingVideoDecoder> weak_factory_;
11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::WeakPtr<DecryptingVideoDecoder> weak_this_;
11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DecryptingVideoDecoder);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_
121