13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef MEDIA_BASE_ANDROID_VIDEO_DECODER_JOB_H_
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define MEDIA_BASE_ANDROID_VIDEO_DECODER_JOB_H_
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <jni.h>
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "media/base/android/media_decoder_job.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace media {
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class VideoCodecBridge;
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Class for managing video decoding jobs.
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class VideoDecoderJob : public MediaDecoderJob {
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Create a new VideoDecoderJob instance.
20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // |request_data_cb| - Callback used to request more data for the decoder.
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // |request_resources_cb| - Callback used to request resources.
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // |on_demuxer_config_changed_cb| - Callback used to inform the caller that
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // demuxer config has changed.
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  VideoDecoderJob(
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::Closure& request_data_cb,
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::Closure& request_resources_cb,
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::Closure& on_demuxer_config_changed_cb);
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~VideoDecoderJob();
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Passes a java surface object to the codec. Returns true if the surface
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // can be used by the decoder, or false otherwise.
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool SetVideoSurface(gfx::ScopedJavaSurface surface);
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // MediaDecoderJob implementation.
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool HasStream() const OVERRIDE;
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void Flush() OVERRIDE;
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void ReleaseDecoderResources() OVERRIDE;
385b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  virtual void SetDemuxerConfigs(const DemuxerConfigs& configs) OVERRIDE;
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool next_video_data_is_iframe() {
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return next_video_data_is_iframe_;
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
445b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  int output_width() const { return output_width_; }
455b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  int output_height() const { return output_height_; }
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // MediaDecoderJob implementation.
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void ReleaseOutputBuffer(
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      int output_buffer_index,
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      size_t size,
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bool render_output,
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::TimeDelta current_presentation_timestamp,
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const ReleaseOutputCompletionCallback& callback) OVERRIDE;
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual bool ComputeTimeToRender() const OVERRIDE;
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual bool IsCodecReconfigureNeeded(
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const DemuxerConfigs& configs) const OVERRIDE;
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool AreDemuxerConfigsChanged(
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const DemuxerConfigs& configs) const OVERRIDE;
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool CreateMediaCodecBridgeInternal() OVERRIDE;
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void CurrentDataConsumed(bool is_config_change) OVERRIDE;
625b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  virtual bool UpdateOutputFormat() OVERRIDE;
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Returns true if a protected surface is required for video playback.
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool IsProtectedSurfaceRequired();
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Video configs from the demuxer.
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  VideoCodec video_codec_;
695b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  int config_width_;
705b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  int config_height_;
715b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
725b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  // Video output format.
735b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  int output_width_;
745b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  int output_height_;
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The surface object currently owned by the player.
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gfx::ScopedJavaSurface surface_;
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Callbacks to inform the caller about decoder resources change.
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::Closure request_resources_cb_;
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::Closure release_resources_cb_;
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Track whether the next access unit is an I-frame. The first access
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // unit after Flush() and CurrentDataConsumed(true) is guaranteed to be an
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // I-frame.
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool next_video_data_is_iframe_;
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VideoDecoderJob);
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace media
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif  // MEDIA_BASE_ANDROID_VIDEO_DECODER_JOB_H_
94