| Index: media/base/android/media_decoder_job.h | 
| diff --git a/media/base/android/media_decoder_job.h b/media/base/android/media_decoder_job.h | 
| deleted file mode 100644 | 
| index 3313e5e053c393c7427a66652bec5acbaad34eb8..0000000000000000000000000000000000000000 | 
| --- a/media/base/android/media_decoder_job.h | 
| +++ /dev/null | 
| @@ -1,367 +0,0 @@ | 
| -// Copyright 2013 The Chromium Authors. All rights reserved. | 
| -// Use of this source code is governed by a BSD-style license that can be | 
| -// found in the LICENSE file. | 
| - | 
| -#ifndef MEDIA_BASE_ANDROID_MEDIA_DECODER_JOB_H_ | 
| -#define MEDIA_BASE_ANDROID_MEDIA_DECODER_JOB_H_ | 
| - | 
| -#include <stddef.h> | 
| -#include <memory> | 
| - | 
| -#include "base/callback.h" | 
| -#include "base/macros.h" | 
| -#include "base/memory/weak_ptr.h" | 
| -#include "base/time/time.h" | 
| -#include "media/base/android/demuxer_stream_player_params.h" | 
| -#include "media/base/android/media_codec_bridge.h" | 
| -#include "ui/gl/android/scoped_java_surface.h" | 
| - | 
| -namespace base { | 
| -class SingleThreadTaskRunner; | 
| -} | 
| - | 
| -namespace media { | 
| - | 
| -class MediaDrmBridge; | 
| - | 
| -// Class for managing all the decoding tasks. Each decoding task will be posted | 
| -// onto the same thread. The thread will be stopped once Stop() is called. | 
| -// Data is stored in 2 chunks. When new data arrives, it is always stored in | 
| -// an inactive chunk. And when the current active chunk becomes empty, a new | 
| -// data request will be sent to the renderer. | 
| -class MediaDecoderJob { | 
| - public: | 
| -  // Return value when Decode() is called. | 
| -  enum MediaDecoderJobStatus { | 
| -    STATUS_SUCCESS, | 
| -    STATUS_KEY_FRAME_REQUIRED, | 
| -    STATUS_FAILURE, | 
| -  }; | 
| - | 
| -  struct Deleter { | 
| -    inline void operator()(MediaDecoderJob* ptr) const { ptr->Release(); } | 
| -  }; | 
| - | 
| -  // Callback when a decoder job finishes its work. Args: whether decode | 
| -  // finished successfully, a flag whether the frame is late for statistics, | 
| -  // cacurrent presentation time, max presentation time. | 
| -  // If the current presentation time is equal to kNoTimestamp, the decoder | 
| -  // job skipped rendering of the decoded output and the callback target should | 
| -  // ignore the timestamps provided. The late frame flag has no meaning in this | 
| -  // case. | 
| -  typedef base::Callback<void(MediaCodecStatus, bool, base::TimeDelta, | 
| -                              base::TimeDelta)> DecoderCallback; | 
| - | 
| -  virtual ~MediaDecoderJob(); | 
| - | 
| -  // Called by MediaSourcePlayer when more data for this object has arrived. | 
| -  void OnDataReceived(const DemuxerData& data); | 
| - | 
| -  // Prefetch so we know the decoder job has data when we call Decode(). | 
| -  // |prefetch_cb| - Run when prefetching has completed. | 
| -  void Prefetch(const base::Closure& prefetch_cb); | 
| - | 
| -  // Called by MediaSourcePlayer to decode some data. | 
| -  // |callback| - Run when decode operation has completed. | 
| -  // | 
| -  // Returns STATUS_SUCCESS on success, or STATUS_FAILURE on failure, or | 
| -  // STATUS_KEY_FRAME_REQUIRED if a browser seek is required. |callback| is | 
| -  // ignored and will not be called for the latter 2 cases. | 
| -  MediaDecoderJobStatus Decode(base::TimeTicks start_time_ticks, | 
| -                               base::TimeDelta start_presentation_timestamp, | 
| -                               const DecoderCallback& callback); | 
| - | 
| -  // Called to stop the last Decode() early. | 
| -  // If the decoder is in the process of decoding the next frame, then | 
| -  // this method will just allow the decode to complete as normal. If | 
| -  // this object is waiting for a data request to complete, then this method | 
| -  // will wait for the data to arrive and then call the |callback| | 
| -  // passed to Decode() with a status of MEDIA_CODEC_ABORT. This ensures that | 
| -  // the |callback| passed to Decode() is always called and the status | 
| -  // reflects whether data was actually decoded or the decode terminated early. | 
| -  void StopDecode(); | 
| - | 
| -  // Flushes the decoder and abandons all the data that is being decoded. | 
| -  virtual void Flush(); | 
| - | 
| -  // Enters prerolling state. The job must not currently be decoding. | 
| -  void BeginPrerolling(base::TimeDelta preroll_timestamp); | 
| - | 
| -  // Releases all the decoder resources as the current tab is going background. | 
| -  virtual void ReleaseDecoderResources(); | 
| - | 
| -  // Sets the demuxer configs. | 
| -  virtual void SetDemuxerConfigs(const DemuxerConfigs& configs) = 0; | 
| - | 
| -  // Returns whether the decoder has finished decoding all the data. | 
| -  bool OutputEOSReached() const; | 
| - | 
| -  // Returns true if the audio/video stream is available, implemented by child | 
| -  // classes. | 
| -  virtual bool HasStream() const = 0; | 
| - | 
| -  void SetDrmBridge(MediaDrmBridge* drm_bridge); | 
| - | 
| -  bool is_decoding() const { return !decode_cb_.is_null(); } | 
| - | 
| -  bool is_content_encrypted() const { return is_content_encrypted_; } | 
| - | 
| -  bool prerolling() const { return prerolling_; } | 
| - | 
| - protected: | 
| -  // Creates a new MediaDecoderJob instance. | 
| -  // |decoder_task_runner| - Thread on which the decoder task will run. | 
| -  // |request_data_cb| - Callback to request more data for the decoder. | 
| -  // |config_changed_cb| - Callback to inform the caller that | 
| -  // demuxer config has changed. | 
| -  MediaDecoderJob( | 
| -      const scoped_refptr<base::SingleThreadTaskRunner>& decoder_task_runner, | 
| -      const base::Closure& request_data_cb, | 
| -      const base::Closure& config_changed_cb); | 
| - | 
| -  // Release the output buffer at index |output_buffer_index| and render it if | 
| -  // |render_output| is true. Upon completion, |callback| will be called. | 
| -  // |is_late_frame| can be passed with the |callback| if the implementation | 
| -  // does not calculate it itself. | 
| -  virtual void ReleaseOutputBuffer( | 
| -      int output_buffer_index, | 
| -      size_t offset, | 
| -      size_t size, | 
| -      bool render_output, | 
| -      bool is_late_frame, | 
| -      base::TimeDelta current_presentation_timestamp, | 
| -      MediaCodecStatus status, | 
| -      const DecoderCallback& callback) = 0; | 
| - | 
| -  // Returns true if the "time to render" needs to be computed for frames in | 
| -  // this decoder job. | 
| -  virtual bool ComputeTimeToRender() const = 0; | 
| - | 
| -  // Gets MediaCrypto object from |drm_bridge_|. | 
| -  jobject GetMediaCrypto(); | 
| - | 
| -  // Releases the |media_codec_bridge_|. | 
| -  void ReleaseMediaCodecBridge(); | 
| - | 
| -  // Sets the current frame to a previously cached key frame. Returns true if | 
| -  // a key frame is found, or false otherwise. | 
| -  // TODO(qinmin): add UMA to study the cache hit ratio for key frames. | 
| -  bool SetCurrentFrameToPreviouslyCachedKeyFrame(); | 
| - | 
| -  MediaDrmBridge* drm_bridge() { return drm_bridge_; } | 
| - | 
| -  void set_is_content_encrypted(bool is_content_encrypted) { | 
| -    is_content_encrypted_ = is_content_encrypted; | 
| -  } | 
| - | 
| -  bool need_to_reconfig_decoder_job_; | 
| - | 
| -  std::unique_ptr<MediaCodecBridge> media_codec_bridge_; | 
| - | 
| - private: | 
| -  friend class MediaSourcePlayerTest; | 
| - | 
| -  // Causes this instance to be deleted on the thread it is bound to. | 
| -  void Release(); | 
| - | 
| -  // Queues an access unit into |media_codec_bridge_|'s input buffer. | 
| -  MediaCodecStatus QueueInputBuffer(const AccessUnit& unit); | 
| - | 
| -  // Returns true if this object has data to decode. | 
| -  bool HasData() const; | 
| - | 
| -  // Initiates a request for more data. | 
| -  // |done_cb| is called when more data is available in |received_data_|. | 
| -  void RequestData(const base::Closure& done_cb); | 
| - | 
| -  // Posts a task to start decoding the current access unit in |received_data_|. | 
| -  void DecodeCurrentAccessUnit( | 
| -      base::TimeTicks start_time_ticks, | 
| -      base::TimeDelta start_presentation_timestamp); | 
| - | 
| -  // Helper function to decode data on |decoder_task_runner_|. |unit| contains | 
| -  // the data to be decoded. |start_time_ticks| and | 
| -  // |start_presentation_timestamp| represent the system time and the | 
| -  // presentation timestamp when the first frame is rendered. We use these | 
| -  // information to estimate when the current frame should be rendered. | 
| -  // If |needs_flush| is true, codec needs to be flushed at the beginning of | 
| -  // this call. | 
| -  // It is possible that |stop_decode_pending_| or |release_resources_pending_| | 
| -  // becomes true while DecodeInternal() is called. However, they should have | 
| -  // no impact on DecodeInternal(). They will be handled after DecoderInternal() | 
| -  // finishes and OnDecodeCompleted() is posted on the UI thread. | 
| -  void DecodeInternal(const AccessUnit& unit, | 
| -                      base::TimeTicks start_time_ticks, | 
| -                      base::TimeDelta start_presentation_timestamp, | 
| -                      bool needs_flush, | 
| -                      const DecoderCallback& callback); | 
| - | 
| -  // Called on the UI thread to indicate that one decode cycle has completed. | 
| -  // Completes any pending job destruction or any pending decode stop. If | 
| -  // destruction was not pending, passes its arguments to |decode_cb_|. | 
| -  void OnDecodeCompleted(MediaCodecStatus status, | 
| -                         bool is_late_frame, | 
| -                         base::TimeDelta current_presentation_timestamp, | 
| -                         base::TimeDelta max_presentation_timestamp); | 
| - | 
| -  // Helper function to get the current access unit that is being decoded. | 
| -  const AccessUnit& CurrentAccessUnit() const; | 
| - | 
| -  // Helper function to get the current data chunk index that is being decoded. | 
| -  size_t CurrentReceivedDataChunkIndex() const; | 
| - | 
| -  // Check whether a chunk has no remaining access units to decode. If | 
| -  // |is_active_chunk| is true, this function returns whether decoder has | 
| -  // consumed all data in |received_data_[current_demuxer_data_index_]|. | 
| -  // Otherwise, it returns whether decoder has consumed all data in the inactive | 
| -  // chunk. | 
| -  bool NoAccessUnitsRemainingInChunk(bool is_active_chunk) const; | 
| - | 
| -  // Requests new data for the current chunk if it runs out of data. | 
| -  void RequestCurrentChunkIfEmpty(); | 
| - | 
| -  // Initializes |received_data_| and |access_unit_index_|. | 
| -  void InitializeReceivedData(); | 
| - | 
| -  // Called when the decoder is completely drained and is ready to be released. | 
| -  void OnDecoderDrained(); | 
| - | 
| -  // Creates |media_codec_bridge_| for decoding purpose. | 
| -  // Returns STATUS_SUCCESS on success, or STATUS_FAILURE on failure, or | 
| -  // STATUS_KEY_FRAME_REQUIRED if a browser seek is required. | 
| -  MediaDecoderJobStatus CreateMediaCodecBridge(); | 
| - | 
| -  // Implemented by the child class to create |media_codec_bridge_| for a | 
| -  // particular stream. | 
| -  // Returns STATUS_SUCCESS on success, or STATUS_FAILURE on failure, or | 
| -  // STATUS_KEY_FRAME_REQUIRED if a browser seek is required. | 
| -  virtual MediaDecoderJobStatus CreateMediaCodecBridgeInternal() = 0; | 
| - | 
| -  // Returns true if the |configs| doesn't match the current demuxer configs | 
| -  // the decoder job has. | 
| -  virtual bool AreDemuxerConfigsChanged( | 
| -      const DemuxerConfigs& configs) const = 0; | 
| - | 
| -  // Returns true if |media_codec_bridge_| needs to be reconfigured for the | 
| -  // new DemuxerConfigs, or false otherwise. | 
| -  virtual bool IsCodecReconfigureNeeded(const DemuxerConfigs& configs) const; | 
| - | 
| -  // Signals to decoder job that decoder has updated output format. Decoder job | 
| -  // may need to do internal reconfiguration in order to correctly interpret | 
| -  // incoming buffers. Returns true if this internal configuration succeeded. | 
| -  virtual bool OnOutputFormatChanged(); | 
| - | 
| -  // Update the output format from the decoder, returns true if the output | 
| -  // format changes, or false otherwise. | 
| -  virtual bool UpdateOutputFormat(); | 
| - | 
| -  // Return the index to |received_data_| that is not currently being decoded. | 
| -  size_t inactive_demuxer_data_index() const { | 
| -    return 1 - current_demuxer_data_index_; | 
| -  } | 
| - | 
| -  // The UI message loop where callbacks should be dispatched. | 
| -  scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; | 
| - | 
| -  // The task runner that decoder job runs on. | 
| -  scoped_refptr<base::SingleThreadTaskRunner> decoder_task_runner_; | 
| - | 
| -  // Whether the decoder needs to be flushed. | 
| -  bool needs_flush_; | 
| - | 
| -  // Whether input EOS is encountered. | 
| -  // TODO(wolenetz/qinmin): Protect with a lock. See http://crbug.com/320043. | 
| -  bool input_eos_encountered_; | 
| - | 
| -  // Whether output EOS is encountered. | 
| -  bool output_eos_encountered_; | 
| - | 
| -  // Tracks whether DecodeInternal() should skip decoding if the first access | 
| -  // unit is EOS or empty, and report |MEDIA_CODEC_OUTPUT_END_OF_STREAM|. This | 
| -  // is to work around some decoders that could crash otherwise. See | 
| -  // http://b/11696552. | 
| -  bool skip_eos_enqueue_; | 
| - | 
| -  // The timestamp the decoder needs to preroll to. If an access unit's | 
| -  // timestamp is smaller than |preroll_timestamp_|, don't render it. | 
| -  // TODO(qinmin): Comparing access unit's timestamp with |preroll_timestamp_| | 
| -  // is not very accurate. | 
| -  base::TimeDelta preroll_timestamp_; | 
| - | 
| -  // Indicates prerolling state. If true, this job has not yet decoded output | 
| -  // that it will render, since the most recent of job construction or | 
| -  // BeginPrerolling(). If false, |preroll_timestamp_| has been reached. | 
| -  // TODO(qinmin): Comparing access unit's timestamp with |preroll_timestamp_| | 
| -  // is not very accurate. | 
| -  bool prerolling_; | 
| - | 
| -  // Callback used to request more data. | 
| -  base::Closure request_data_cb_; | 
| - | 
| -  // Callback to notify the caller config has changed. | 
| -  base::Closure config_changed_cb_; | 
| - | 
| -  // Callback to run when new data has been received. | 
| -  base::Closure data_received_cb_; | 
| - | 
| -  // Callback to run when the current Decode() operation completes. | 
| -  DecoderCallback decode_cb_; | 
| - | 
| -  // Data received over IPC from last RequestData() operation. | 
| -  // We keep 2 chunks at the same time to reduce the IPC latency between chunks. | 
| -  // If data inside the current chunk are all decoded, we will request a new | 
| -  // chunk from the demuxer and swap the current chunk with the other one. | 
| -  // New data will always be stored in the other chunk since the current | 
| -  // one may be still in use. | 
| -  DemuxerData received_data_[2]; | 
| - | 
| -  // Index to the current data chunk that is being decoded. | 
| -  size_t current_demuxer_data_index_; | 
| - | 
| -  // Index to the access unit inside each data chunk that is being decoded. | 
| -  size_t access_unit_index_[2]; | 
| - | 
| -  // The index of input buffer that can be used by QueueInputBuffer(). | 
| -  // If the index is uninitialized or invalid, it must be -1. | 
| -  int input_buf_index_; | 
| - | 
| -  // Indicates whether content is encrypted. | 
| -  bool is_content_encrypted_; | 
| - | 
| -  // Indicates the decoder job should stop after decoding the current access | 
| -  // unit. | 
| -  bool stop_decode_pending_; | 
| - | 
| -  // Indicates that this object should be destroyed once the current | 
| -  // Decode() has completed. This gets set when Release() gets called | 
| -  // while there is a decode in progress. | 
| -  bool destroy_pending_; | 
| - | 
| -  // Indicates whether the decoder is in the middle of requesting new data. | 
| -  bool is_requesting_demuxer_data_; | 
| - | 
| -  // Indicates whether the incoming data should be ignored. | 
| -  bool is_incoming_data_invalid_; | 
| - | 
| -  // Indicates that |media_codec_bridge_| should be released once the current | 
| -  // Decode() has completed. This gets set when ReleaseDecoderResources() gets | 
| -  // called while there is a decode in progress. | 
| -  bool release_resources_pending_; | 
| - | 
| -  // Pointer to a DRM object that will be used for encrypted streams. | 
| -  MediaDrmBridge* drm_bridge_; | 
| - | 
| -  // Indicates whether |media_codec_bridge_| is in the middle of being drained | 
| -  // due to a config change. | 
| -  bool drain_decoder_; | 
| - | 
| -  // This access unit is passed to the decoder during config changes to drain | 
| -  // the decoder. | 
| -  AccessUnit eos_unit_; | 
| - | 
| -  DISALLOW_IMPLICIT_CONSTRUCTORS(MediaDecoderJob); | 
| -}; | 
| - | 
| -}  // namespace media | 
| - | 
| -#endif  // MEDIA_BASE_ANDROID_MEDIA_DECODER_JOB_H_ | 
|  |