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