decrypting_video_decoder.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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.
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Initialize(const VideoDecoderConfig& config,
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                          bool live_mode,
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          const PipelineStatusCB& status_cb,
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          const OutputCB& output_cb) OVERRIDE;
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                      const DecodeCB& decode_cb) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Reset(const base::Closure& closure) OVERRIDE;
42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void Stop() 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)    kStopped,
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    kError
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for DecryptorHost::RequestDecryptor().
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDecryptor(Decryptor* decryptor);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callback for Decryptor::InitializeVideoDecoder() during initialization.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishInitialization(bool success);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DecodePendingBuffer();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for Decryptor::DecryptAndDecodeVideo().
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeliverFrame(int buffer_size,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    Decryptor::Status status,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const scoped_refptr<VideoFrame>& frame);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callback for the |decryptor_| to notify this object that a new key has been
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // added.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnKeyAdded();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset decoder and call |reset_cb_|.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoReset();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Free decoder resources and call |stop_cb_|.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoStop();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  State state_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PipelineStatusCB init_cb_;
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  OutputCB output_cb_;
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DecodeCB decode_cb_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure reset_cb_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  VideoDecoderConfig config_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback to request/cancel decryptor creation notification.
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetDecryptorReadyCB set_decryptor_ready_cb_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Decryptor* decryptor_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The buffer that needs decrypting/decoding.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<media::DecoderBuffer> pending_buffer_to_decode_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Indicates the situation where new key is added during pending decode
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (in other words, this variable can only be set in state kPendingDecode).
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If this variable is true and kNoKey is returned then we need to try
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // decrypting/decoding again in case the newly added key is the correct
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // decryption key.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool key_added_while_decode_pending_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A unique ID to trace Decryptor::DecryptAndDecodeVideo() call and the
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matching DecryptCB call (in DoDeliverFrame()).
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 trace_id_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // NOTE: Weak pointers must be invalidated before all other member variables.
11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::WeakPtrFactory<DecryptingVideoDecoder> weak_factory_;
11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  base::WeakPtr<DecryptingVideoDecoder> weak_this_;
11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DecryptingVideoDecoder);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_FILTERS_DECRYPTING_VIDEO_DECODER_H_
123