decrypting_demuxer_stream.h revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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_DEMUXER_STREAM_H_
6#define MEDIA_FILTERS_DECRYPTING_DEMUXER_STREAM_H_
7
8#include "base/callback.h"
9#include "base/memory/ref_counted.h"
10#include "base/memory/weak_ptr.h"
11#include "media/base/audio_decoder_config.h"
12#include "media/base/decryptor.h"
13#include "media/base/demuxer_stream.h"
14#include "media/base/pipeline_status.h"
15#include "media/base/video_decoder_config.h"
16
17namespace base {
18class SingleThreadTaskRunner;
19}
20
21namespace media {
22
23class DecoderBuffer;
24
25// Decryptor-based DemuxerStream implementation that converts a potentially
26// encrypted demuxer stream to a clear demuxer stream.
27// All public APIs and callbacks are trampolined to the |task_runner_| so
28// that no locks are required for thread safety.
29class MEDIA_EXPORT DecryptingDemuxerStream : public DemuxerStream {
30 public:
31  DecryptingDemuxerStream(
32      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
33      const SetDecryptorReadyCB& set_decryptor_ready_cb);
34
35  // Cancels all pending operations immediately and fires all pending callbacks.
36  virtual ~DecryptingDemuxerStream();
37
38  void Initialize(DemuxerStream* stream,
39                  const PipelineStatusCB& status_cb);
40
41  // Cancels all pending operations and fires all pending callbacks. If in
42  // kPendingDemuxerRead or kPendingDecrypt state, waits for the pending
43  // operation to finish before satisfying |closure|. Sets the state to
44  // kUninitialized if |this| hasn't been initialized, or to kIdle otherwise.
45  void Reset(const base::Closure& closure);
46
47  // DemuxerStream implementation.
48  virtual void Read(const ReadCB& read_cb) OVERRIDE;
49  virtual AudioDecoderConfig audio_decoder_config() OVERRIDE;
50  virtual VideoDecoderConfig video_decoder_config() OVERRIDE;
51  virtual Type type() OVERRIDE;
52  virtual void EnableBitstreamConverter() OVERRIDE;
53  virtual bool SupportsConfigChanges() OVERRIDE;
54  virtual VideoRotation video_rotation() OVERRIDE;
55
56 private:
57  // For a detailed state diagram please see this link: http://goo.gl/8jAok
58  // TODO(xhwang): Add a ASCII state diagram in this file after this class
59  // stabilizes.
60  // TODO(xhwang): Update this diagram for DecryptingDemuxerStream.
61  enum State {
62    kUninitialized = 0,
63    kDecryptorRequested,
64    kIdle,
65    kPendingDemuxerRead,
66    kPendingDecrypt,
67    kWaitingForKey
68  };
69
70  // Callback for DecryptorHost::RequestDecryptor(). |decryptor_attached_cb| is
71  // called when the decryptor has been completely attached to the pipeline.
72  void SetDecryptor(Decryptor* decryptor,
73                    const DecryptorAttachedCB& decryptor_attached_cb);
74
75  // Callback for DemuxerStream::Read().
76  void DecryptBuffer(DemuxerStream::Status status,
77                     const scoped_refptr<DecoderBuffer>& buffer);
78
79  void DecryptPendingBuffer();
80
81  // Callback for Decryptor::Decrypt().
82  void DeliverBuffer(Decryptor::Status status,
83                     const scoped_refptr<DecoderBuffer>& decrypted_buffer);
84
85  // Callback for the |decryptor_| to notify this object that a new key has been
86  // added.
87  void OnKeyAdded();
88
89  // Resets decoder and calls |reset_cb_|.
90  void DoReset();
91
92  // Returns Decryptor::StreamType converted from |stream_type_|.
93  Decryptor::StreamType GetDecryptorStreamType() const;
94
95  // Creates and initializes either |audio_config_| or |video_config_| based on
96  // |demuxer_stream_|.
97  void InitializeDecoderConfig();
98
99  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
100
101  State state_;
102
103  PipelineStatusCB init_cb_;
104  ReadCB read_cb_;
105  base::Closure reset_cb_;
106
107  // Pointer to the input demuxer stream that will feed us encrypted buffers.
108  DemuxerStream* demuxer_stream_;
109
110  AudioDecoderConfig audio_config_;
111  VideoDecoderConfig video_config_;
112
113  // Callback to request/cancel decryptor creation notification.
114  SetDecryptorReadyCB set_decryptor_ready_cb_;
115
116  Decryptor* decryptor_;
117
118  // The buffer returned by the demuxer that needs to be decrypted.
119  scoped_refptr<media::DecoderBuffer> pending_buffer_to_decrypt_;
120
121  // Indicates the situation where new key is added during pending decryption
122  // (in other words, this variable can only be set in state kPendingDecrypt).
123  // If this variable is true and kNoKey is returned then we need to try
124  // decrypting again in case the newly added key is the correct decryption key.
125  bool key_added_while_decrypt_pending_;
126
127  // NOTE: Weak pointers must be invalidated before all other member variables.
128  base::WeakPtrFactory<DecryptingDemuxerStream> weak_factory_;
129  base::WeakPtr<DecryptingDemuxerStream> weak_this_;
130
131  DISALLOW_COPY_AND_ASSIGN(DecryptingDemuxerStream);
132};
133
134}  // namespace media
135
136#endif  // MEDIA_FILTERS_DECRYPTING_DEMUXER_STREAM_H_
137