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)#include "media/base/android/media_decoder_job.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/bind.h" 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/callback_helpers.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/debug/trace_event.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "media/base/android/media_codec_bridge.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "media/base/android/media_drm_bridge.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/bind_to_current_loop.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "media/base/buffers.h" 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace media { 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Timeout value for media codec operations. Because the first 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// DequeInputBuffer() can take about 150 milliseconds, use 250 milliseconds 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// here. See http://b/9357571. 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)static const int kMediaCodecTimeoutInMilliseconds = 250; 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)MediaDecoderJob::MediaDecoderJob( 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& decoder_task_runner, 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Closure& request_data_cb, 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Closure& config_changed_cb) 275b892326406927b709cdaf6c384d4ababf456332Ben Murdoch : need_to_reconfig_decoder_job_(false), 285b892326406927b709cdaf6c384d4ababf456332Ben Murdoch ui_task_runner_(base::MessageLoopProxy::current()), 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decoder_task_runner_(decoder_task_runner), 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) needs_flush_(false), 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) input_eos_encountered_(false), 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_eos_encountered_(false), 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) skip_eos_enqueue_(true), 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerolling_(true), 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request_data_cb_(request_data_cb), 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) config_changed_cb_(config_changed_cb), 3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) current_demuxer_data_index_(0), 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_buf_index_(-1), 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) is_content_encrypted_(false), 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) stop_decode_pending_(false), 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) destroy_pending_(false), 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) is_requesting_demuxer_data_(false), 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) is_incoming_data_invalid_(false), 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) release_resources_pending_(false), 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) drm_bridge_(NULL), 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) drain_decoder_(false) { 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) InitializeReceivedData(); 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) eos_unit_.end_of_stream = true; 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MediaDecoderJob::~MediaDecoderJob() { 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ReleaseMediaCodecBridge(); 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void MediaDecoderJob::OnDataReceived(const DemuxerData& data) { 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << ": " << data.access_units.size() << " units"; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(NoAccessUnitsRemainingInChunk(false)); 59424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TRACE_EVENT_ASYNC_END2( 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "media", "MediaDecoderJob::RequestData", this, 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "Data type", data.type == media::DemuxerStream::AUDIO ? "AUDIO" : "VIDEO", 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "Units read", data.access_units.size()); 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (is_incoming_data_invalid_) { 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) is_incoming_data_invalid_ = false; 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // If there is a pending callback, need to request the data again to get 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // valid data. 7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!data_received_cb_.is_null()) 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) request_data_cb_.Run(); 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) else 7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) is_requesting_demuxer_data_ = false; 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return; 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) size_t next_demuxer_data_index = inactive_demuxer_data_index(); 7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) received_data_[next_demuxer_data_index] = data; 7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) access_unit_index_[next_demuxer_data_index] = 0; 8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) is_requesting_demuxer_data_ = false; 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Closure done_cb = base::ResetAndReturn(&data_received_cb_); 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If this data request is for the inactive chunk, or |data_received_cb_| 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // was set to null by Flush() or Release(), do nothing. 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (done_cb.is_null()) 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return; 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (stop_decode_pending_) { 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DCHECK(is_decoding()); 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch OnDecodeCompleted(MEDIA_CODEC_STOPPED, kNoTimestamp(), kNoTimestamp()); 92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return; 93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch done_cb.Run(); 96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 97424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 98424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void MediaDecoderJob::Prefetch(const base::Closure& prefetch_cb) { 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(data_received_cb_.is_null()); 101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK(decode_cb_.is_null()); 102424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (HasData()) { 1040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << " : using previously received data"; 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui_task_runner_->PostTask(FROM_HERE, prefetch_cb); 106424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return; 107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 108424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << " : requesting data"; 110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) RequestData(prefetch_cb); 111424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 112424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool MediaDecoderJob::Decode( 11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::TimeTicks start_time_ticks, 11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::TimeDelta start_presentation_timestamp, 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const DecoderCallback& callback) { 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK(decode_cb_.is_null()); 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(data_received_cb_.is_null()); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!media_codec_bridge_ || need_to_reconfig_decoder_job_) { 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) need_to_reconfig_decoder_job_ = !CreateMediaCodecBridge(); 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (drain_decoder_) { 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Decoder has been recreated, stop draining. 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) drain_decoder_ = false; 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) input_eos_encountered_ = false; 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) output_eos_encountered_ = false; 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) access_unit_index_[current_demuxer_data_index_]++; 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) skip_eos_enqueue_ = true; 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (need_to_reconfig_decoder_job_) 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) decode_cb_ = callback; 136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!HasData()) { 13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RequestData(base::Bind(&MediaDecoderJob::DecodeCurrentAccessUnit, 139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Unretained(this), 140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) start_time_ticks, 141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) start_presentation_timestamp)); 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DecodeCurrentAccessUnit(start_time_ticks, start_presentation_timestamp); 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 147424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void MediaDecoderJob::StopDecode() { 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK(is_decoding()); 152424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) stop_decode_pending_ = true; 153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool MediaDecoderJob::OutputEOSReached() const { 15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return !drain_decoder_ && output_eos_encountered_; 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaDecoderJob::SetDrmBridge(MediaDrmBridge* drm_bridge) { 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) drm_bridge_ = drm_bridge; 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) need_to_reconfig_decoder_job_ = true; 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void MediaDecoderJob::Flush() { 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(data_received_cb_.is_null()); 168424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK(decode_cb_.is_null()); 169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Clean up the received data. 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) current_demuxer_data_index_ = 0; 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InitializeReceivedData(); 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (is_requesting_demuxer_data_) 17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) is_incoming_data_invalid_ = true; 17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) input_eos_encountered_ = false; 17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) output_eos_encountered_ = false; 17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) drain_decoder_ = false; 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Do nothing, flush when the next Decode() happens. 180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) needs_flush_ = true; 181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 18323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MediaDecoderJob::BeginPrerolling(base::TimeDelta preroll_timestamp) { 1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << "(" << preroll_timestamp.InSecondsF() << ")"; 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(!is_decoding()); 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) preroll_timestamp_ = preroll_timestamp; 1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerolling_ = true; 1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 19246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaDecoderJob::ReleaseDecoderResources() { 19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (decode_cb_.is_null()) { 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(!drain_decoder_); 19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Since the decoder job is not decoding data, we can safely destroy 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |media_codec_bridge_|. 19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ReleaseMediaCodecBridge(); 20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Release |media_codec_bridge_| once decoding is completed. 20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) release_resources_pending_ = true; 20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::android::ScopedJavaLocalRef<jobject> MediaDecoderJob::GetMediaCrypto() { 20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::android::ScopedJavaLocalRef<jobject> media_crypto; 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (drm_bridge_) 21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) media_crypto = drm_bridge_->GetMediaCrypto(); 21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return media_crypto; 21246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void MediaDecoderJob::Release() { 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 2160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DVLOG(1) << __FUNCTION__; 217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If the decoder job is still decoding, we cannot delete the job immediately. 21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) destroy_pending_ = is_decoding(); 220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 221424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request_data_cb_.Reset(); 22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) data_received_cb_.Reset(); 223424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) decode_cb_.Reset(); 224424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (destroy_pending_) { 2260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << " : delete is pending decode completion"; 227424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return; 2280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 230424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delete this; 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MediaCodecStatus MediaDecoderJob::QueueInputBuffer(const AccessUnit& unit) { 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(decoder_task_runner_->BelongsToCurrentThread()); 2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TRACE_EVENT0("media", __FUNCTION__); 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int input_buf_index = input_buf_index_; 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_buf_index_ = -1; 24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(xhwang): Hide DequeueInputBuffer() and the index in MediaCodecBridge. 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (input_buf_index == -1) { 24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta timeout = base::TimeDelta::FromMilliseconds( 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kMediaCodecTimeoutInMilliseconds); 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecStatus status = 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) media_codec_bridge_->DequeueInputBuffer(timeout, &input_buf_index); 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (status != MEDIA_CODEC_OK) { 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << "DequeueInputBuffer fails: " << status; 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return status; 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(qinmin): skip frames if video is falling far behind. 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK_GE(input_buf_index, 0); 2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (unit.end_of_stream || unit.data.empty()) { 2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) media_codec_bridge_->QueueEOS(input_buf_index); 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return MEDIA_CODEC_INPUT_END_OF_STREAM; 2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (unit.key_id.empty() || unit.iv.empty()) { 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(unit.iv.empty() || !unit.key_id.empty()); 26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return media_codec_bridge_->QueueInputBuffer( 2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) input_buf_index, &unit.data[0], unit.data.size(), unit.timestamp); 2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecStatus status = media_codec_bridge_->QueueSecureInputBuffer( 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) input_buf_index, 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &unit.data[0], unit.data.size(), 26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) reinterpret_cast<const uint8*>(&unit.key_id[0]), unit.key_id.size(), 27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) reinterpret_cast<const uint8*>(&unit.iv[0]), unit.iv.size(), 2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unit.subsamples.empty() ? NULL : &unit.subsamples[0], 2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unit.subsamples.size(), 2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) unit.timestamp); 27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // In case of MEDIA_CODEC_NO_KEY, we must reuse the |input_buf_index_|. 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Otherwise MediaDrm will report errors. 27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (status == MEDIA_CODEC_NO_KEY) 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_buf_index_ = input_buf_index; 27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return status; 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool MediaDecoderJob::HasData() const { 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 28523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // When |input_eos_encountered_| is set, |access_unit_index_| and 286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |current_demuxer_data_index_| must be pointing to an EOS unit, 287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // or a |kConfigChanged| unit if |drain_decoder_| is true. In both cases, 288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // we'll feed an EOS input unit to drain the decoder until we hit output EOS. 28923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(!input_eos_encountered_ || !NoAccessUnitsRemainingInChunk(true)); 29023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return !NoAccessUnitsRemainingInChunk(true) || 29123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) !NoAccessUnitsRemainingInChunk(false); 2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 294424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void MediaDecoderJob::RequestData(const base::Closure& done_cb) { 29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 29746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(data_received_cb_.is_null()); 29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!input_eos_encountered_); 29923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(NoAccessUnitsRemainingInChunk(false)); 300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0("media", "MediaDecoderJob::RequestData", this); 3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) data_received_cb_ = done_cb; 304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 30523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // If we are already expecting new data, just set the callback and do 30623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // nothing. 30723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (is_requesting_demuxer_data_) 30823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return; 30923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 31023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The new incoming data will be stored as the next demuxer data chunk, since 31123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // the decoder might still be decoding the current one. 31223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) size_t next_demuxer_data_index = inactive_demuxer_data_index(); 31323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) received_data_[next_demuxer_data_index] = DemuxerData(); 31423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) access_unit_index_[next_demuxer_data_index] = 0; 31523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) is_requesting_demuxer_data_ = true; 31623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) request_data_cb_.Run(); 318424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 319424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 32023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MediaDecoderJob::DecodeCurrentAccessUnit( 32123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::TimeTicks start_time_ticks, 32223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::TimeDelta start_presentation_timestamp) { 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK(!decode_cb_.is_null()); 325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 32623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RequestCurrentChunkIfEmpty(); 32723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const AccessUnit& access_unit = CurrentAccessUnit(); 32846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (CurrentAccessUnit().status == DemuxerStream::kConfigChanged) { 32946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int index = CurrentReceivedDataChunkIndex(); 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const DemuxerConfigs& configs = received_data_[index].demuxer_configs[0]; 331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool reconfigure_needed = IsCodecReconfigureNeeded(configs); 3325b892326406927b709cdaf6c384d4ababf456332Ben Murdoch SetDemuxerConfigs(configs); 33346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!drain_decoder_) { 33446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If we haven't decoded any data yet, just skip the current access unit 33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // and request the MediaCodec to be recreated on next Decode(). 336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (skip_eos_enqueue_ || !reconfigure_needed) { 33746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) need_to_reconfig_decoder_job_ = 338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) need_to_reconfig_decoder_job_ || reconfigure_needed; 3395b892326406927b709cdaf6c384d4ababf456332Ben Murdoch // Report MEDIA_CODEC_OK status so decoder will continue decoding and 3405b892326406927b709cdaf6c384d4ababf456332Ben Murdoch // MEDIA_CODEC_OUTPUT_FORMAT_CHANGED status will come later. 34146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui_task_runner_->PostTask(FROM_HERE, base::Bind( 34246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &MediaDecoderJob::OnDecodeCompleted, base::Unretained(this), 3435b892326406927b709cdaf6c384d4ababf456332Ben Murdoch MEDIA_CODEC_OK, kNoTimestamp(), kNoTimestamp())); 34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 34646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Start draining the decoder so that all the remaining frames are 34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // rendered. 34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) drain_decoder_ = true; 34946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 3501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 3511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 35246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(!(needs_flush_ && drain_decoder_)); 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decoder_task_runner_->PostTask(FROM_HERE, base::Bind( 354424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &MediaDecoderJob::DecodeInternal, base::Unretained(this), 35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) drain_decoder_ ? eos_unit_ : access_unit, 356424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) start_time_ticks, start_presentation_timestamp, needs_flush_, 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::BindToCurrentLoop(base::Bind( 358424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &MediaDecoderJob::OnDecodeCompleted, base::Unretained(this))))); 359424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) needs_flush_ = false; 360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void MediaDecoderJob::DecodeInternal( 3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const AccessUnit& unit, 36423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::TimeTicks start_time_ticks, 36523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::TimeDelta start_presentation_timestamp, 3663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool needs_flush, 3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const MediaDecoderJob::DecoderCallback& callback) { 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(decoder_task_runner_->BelongsToCurrentThread()); 3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TRACE_EVENT0("media", __FUNCTION__); 37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (needs_flush) { 3733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DVLOG(1) << "DecodeInternal needs flush."; 3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) input_eos_encountered_ = false; 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_eos_encountered_ = false; 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecStatus reset_status = media_codec_bridge_->Reset(); 37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (MEDIA_CODEC_OK != reset_status) { 3780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch callback.Run(reset_status, kNoTimestamp(), kNoTimestamp()); 37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Once output EOS has occurred, we should not be asked to decode again. 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // MediaCodec has undefined behavior if similarly asked to decode after output 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // EOS. 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!output_eos_encountered_); 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // For aborted access unit, just skip it and inform the player. 3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (unit.status == DemuxerStream::kAborted) { 3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(qinmin): use a new enum instead of MEDIA_CODEC_STOPPED. 3910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch callback.Run(MEDIA_CODEC_STOPPED, kNoTimestamp(), kNoTimestamp()); 3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (skip_eos_enqueue_) { 396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (unit.end_of_stream || unit.data.empty()) { 397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) input_eos_encountered_ = true; 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_eos_encountered_ = true; 3990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch callback.Run(MEDIA_CODEC_OUTPUT_END_OF_STREAM, kNoTimestamp(), 4000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch kNoTimestamp()); 401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) skip_eos_enqueue_ = false; 405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MediaCodecStatus input_status = MEDIA_CODEC_INPUT_END_OF_STREAM; 4083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!input_eos_encountered_) { 40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) input_status = QueueInputBuffer(unit); 41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (input_status == MEDIA_CODEC_INPUT_END_OF_STREAM) { 4113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) input_eos_encountered_ = true; 41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else if (input_status != MEDIA_CODEC_OK) { 4130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch callback.Run(input_status, kNoTimestamp(), kNoTimestamp()); 4143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 4153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int buffer_index = 0; 4193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t offset = 0; 4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) size_t size = 0; 4213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::TimeDelta presentation_timestamp; 4223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::TimeDelta timeout = base::TimeDelta::FromMilliseconds( 4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) kMediaCodecTimeoutInMilliseconds); 42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4265b892326406927b709cdaf6c384d4ababf456332Ben Murdoch MediaCodecStatus status = MEDIA_CODEC_OK; 4275b892326406927b709cdaf6c384d4ababf456332Ben Murdoch bool has_format_change = false; 4285b892326406927b709cdaf6c384d4ababf456332Ben Murdoch // Dequeue the output buffer until a MEDIA_CODEC_OK, MEDIA_CODEC_ERROR or 4295b892326406927b709cdaf6c384d4ababf456332Ben Murdoch // MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER is received. 4305b892326406927b709cdaf6c384d4ababf456332Ben Murdoch do { 4315b892326406927b709cdaf6c384d4ababf456332Ben Murdoch status = media_codec_bridge_->DequeueOutputBuffer( 4325b892326406927b709cdaf6c384d4ababf456332Ben Murdoch timeout, 4335b892326406927b709cdaf6c384d4ababf456332Ben Murdoch &buffer_index, 4345b892326406927b709cdaf6c384d4ababf456332Ben Murdoch &offset, 4355b892326406927b709cdaf6c384d4ababf456332Ben Murdoch &size, 4365b892326406927b709cdaf6c384d4ababf456332Ben Murdoch &presentation_timestamp, 4375b892326406927b709cdaf6c384d4ababf456332Ben Murdoch &output_eos_encountered_, 4385b892326406927b709cdaf6c384d4ababf456332Ben Murdoch NULL); 4391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (status == MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED && 4401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) !media_codec_bridge_->GetOutputBuffers()) { 4411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) status = MEDIA_CODEC_ERROR; 4425b892326406927b709cdaf6c384d4ababf456332Ben Murdoch } else if (status == MEDIA_CODEC_OUTPUT_FORMAT_CHANGED) { 4435b892326406927b709cdaf6c384d4ababf456332Ben Murdoch // TODO(qinmin): instead of waiting for the next output buffer to be 4445b892326406927b709cdaf6c384d4ababf456332Ben Murdoch // dequeued, post a task on the UI thread to signal the format change. 4455b892326406927b709cdaf6c384d4ababf456332Ben Murdoch has_format_change = true; 4463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 4475b892326406927b709cdaf6c384d4ababf456332Ben Murdoch } while (status != MEDIA_CODEC_OK && status != MEDIA_CODEC_ERROR && 4485b892326406927b709cdaf6c384d4ababf456332Ben Murdoch status != MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER); 4495b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 4505b892326406927b709cdaf6c384d4ababf456332Ben Murdoch if (status != MEDIA_CODEC_OK) { 4510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch callback.Run(status, kNoTimestamp(), kNoTimestamp()); 45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(xhwang/qinmin): This logic is correct but strange. Clean it up. 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (output_eos_encountered_) 45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) status = MEDIA_CODEC_OUTPUT_END_OF_STREAM; 4585b892326406927b709cdaf6c384d4ababf456332Ben Murdoch else if (has_format_change) 4595b892326406927b709cdaf6c384d4ababf456332Ben Murdoch status = MEDIA_CODEC_OUTPUT_FORMAT_CHANGED; 46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool render_output = presentation_timestamp >= preroll_timestamp_ && 4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (status != MEDIA_CODEC_OUTPUT_END_OF_STREAM || size != 0u); 46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta time_to_render; 46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(!start_time_ticks.is_null()); 4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (render_output && ComputeTimeToRender()) { 46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) time_to_render = presentation_timestamp - (base::TimeTicks::Now() - 46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start_time_ticks + start_presentation_timestamp); 46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (time_to_render > base::TimeDelta()) { 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decoder_task_runner_->PostDelayedTask( 47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FROM_HERE, 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Bind(&MediaDecoderJob::ReleaseOutputBuffer, 47446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Unretained(this), 47523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) buffer_index, 47623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) size, 47723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) render_output, 4780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch presentation_timestamp, 4790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Bind(callback, status)), 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) time_to_render); 48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 4823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(qinmin): The codec is lagging behind, need to recalculate the 4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // |start_presentation_timestamp_| and |start_time_ticks_| in 4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // media_source_player.cc. 48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DVLOG(1) << "codec is lagging behind :" << time_to_render.InMicroseconds(); 4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (render_output) { 4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The player won't expect a timestamp smaller than the 4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // |start_presentation_timestamp|. However, this could happen due to decoder 4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // errors. 4924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) presentation_timestamp = std::max( 4934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) presentation_timestamp, start_presentation_timestamp); 4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) presentation_timestamp = kNoTimestamp(); 4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ReleaseOutputCompletionCallback completion_callback = base::Bind( 4980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch callback, status); 4990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ReleaseOutputBuffer(buffer_index, size, render_output, presentation_timestamp, 5000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch completion_callback); 5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 503424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void MediaDecoderJob::OnDecodeCompleted( 5040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch MediaCodecStatus status, base::TimeDelta current_presentation_timestamp, 5050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::TimeDelta max_presentation_timestamp) { 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 5073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 508424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (destroy_pending_) { 5090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DVLOG(1) << __FUNCTION__ << " : completing pending deletion"; 510424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delete this; 5113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 5123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 51446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (status == MEDIA_CODEC_OUTPUT_END_OF_STREAM) 51546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) output_eos_encountered_ = true; 51646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 517424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) DCHECK(!decode_cb_.is_null()); 5181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // If output was queued for rendering, then we have completed prerolling. 5200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (current_presentation_timestamp != kNoTimestamp()) 5211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) prerolling_ = false; 5221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (status) { 52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_CODEC_OK: 52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER: 52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: 52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_CODEC_OUTPUT_END_OF_STREAM: 52846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!input_eos_encountered_) { 52946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CurrentDataConsumed( 53046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CurrentAccessUnit().status == DemuxerStream::kConfigChanged); 53123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) access_unit_index_[current_demuxer_data_index_]++; 53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 53458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_CODEC_DEQUEUE_INPUT_AGAIN_LATER: 53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_CODEC_INPUT_END_OF_STREAM: 53758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_CODEC_NO_KEY: 53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_CODEC_STOPPED: 53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case MEDIA_CODEC_ERROR: 54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Do nothing. 54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) break; 5425b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 5435b892326406927b709cdaf6c384d4ababf456332Ben Murdoch case MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED: 5445b892326406927b709cdaf6c384d4ababf456332Ben Murdoch DCHECK(false) << "Invalid output status"; 5455b892326406927b709cdaf6c384d4ababf456332Ben Murdoch break; 54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) }; 547424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 54846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (status == MEDIA_CODEC_OUTPUT_END_OF_STREAM && drain_decoder_) { 54946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnDecoderDrained(); 55046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) status = MEDIA_CODEC_OK; 55146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 55246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5535b892326406927b709cdaf6c384d4ababf456332Ben Murdoch if (status == MEDIA_CODEC_OUTPUT_FORMAT_CHANGED) { 5545b892326406927b709cdaf6c384d4ababf456332Ben Murdoch if (UpdateOutputFormat()) 5555b892326406927b709cdaf6c384d4ababf456332Ben Murdoch config_changed_cb_.Run(); 5565b892326406927b709cdaf6c384d4ababf456332Ben Murdoch status = MEDIA_CODEC_OK; 5575b892326406927b709cdaf6c384d4ababf456332Ben Murdoch } 5585b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 55946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (release_resources_pending_) { 56046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ReleaseMediaCodecBridge(); 56146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) release_resources_pending_ = false; 56246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (drain_decoder_) 56346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OnDecoderDrained(); 56446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 56546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 566424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) stop_decode_pending_ = false; 5670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::ResetAndReturn(&decode_cb_).Run( 5680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch status, current_presentation_timestamp, max_presentation_timestamp); 5693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 5703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 57123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const AccessUnit& MediaDecoderJob::CurrentAccessUnit() const { 57223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 57323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(HasData()); 574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t index = CurrentReceivedDataChunkIndex(); 57523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return received_data_[index].access_units[access_unit_index_[index]]; 57623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 57723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)size_t MediaDecoderJob::CurrentReceivedDataChunkIndex() const { 579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NoAccessUnitsRemainingInChunk(true) ? 580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) inactive_demuxer_data_index() : current_demuxer_data_index_; 581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 58323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)bool MediaDecoderJob::NoAccessUnitsRemainingInChunk( 58423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool is_active_chunk) const { 58523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 58623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) size_t index = is_active_chunk ? current_demuxer_data_index_ : 58723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) inactive_demuxer_data_index(); 58823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return received_data_[index].access_units.size() <= access_unit_index_[index]; 58923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 59023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 59123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MediaDecoderJob::RequestCurrentChunkIfEmpty() { 59223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 59323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DCHECK(HasData()); 59423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!NoAccessUnitsRemainingInChunk(true)) 59523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return; 59623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 59723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Requests new data if the the last access unit of the next chunk is not EOS. 59823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) current_demuxer_data_index_ = inactive_demuxer_data_index(); 59923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const AccessUnit last_access_unit = 60023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) received_data_[current_demuxer_data_index_].access_units.back(); 60123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) if (!last_access_unit.end_of_stream && 60223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) last_access_unit.status != DemuxerStream::kAborted) { 60323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) RequestData(base::Closure()); 60423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 60523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 60623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 60723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void MediaDecoderJob::InitializeReceivedData() { 60823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) for (size_t i = 0; i < 2; ++i) { 60923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) received_data_[i] = DemuxerData(); 61023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) access_unit_index_[i] = 0; 61123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 61223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)} 61323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 61446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaDecoderJob::OnDecoderDrained() { 61546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 61646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 61746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(drain_decoder_); 61846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 61946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) input_eos_encountered_ = false; 62046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) output_eos_encountered_ = false; 62146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) drain_decoder_ = false; 62246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ReleaseMediaCodecBridge(); 62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Increase the access unit index so that the new decoder will not handle 62446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // the config change again. 62546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) access_unit_index_[current_demuxer_data_index_]++; 62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CurrentDataConsumed(true); 62746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 62846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 62946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool MediaDecoderJob::CreateMediaCodecBridge() { 63046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__; 63146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(ui_task_runner_->BelongsToCurrentThread()); 63246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DCHECK(decode_cb_.is_null()); 63346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 63446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!HasStream()) { 63546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ReleaseMediaCodecBridge(); 63646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 63746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 63846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 63946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Create |media_codec_bridge_| only if config changes. 64046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (media_codec_bridge_ && !need_to_reconfig_decoder_job_) 64146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 64246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 64346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::android::ScopedJavaLocalRef<jobject> media_crypto = GetMediaCrypto(); 64446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (is_content_encrypted_ && media_crypto.is_null()) 64546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 64646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 64746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ReleaseMediaCodecBridge(); 64846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DVLOG(1) << __FUNCTION__ << " : creating new media codec bridge"; 64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return CreateMediaCodecBridgeInternal(); 65146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 65246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 653f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool MediaDecoderJob::IsCodecReconfigureNeeded( 654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const DemuxerConfigs& configs) const { 655f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!AreDemuxerConfigsChanged(configs)) 656f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 657f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 658f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 659f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 6605b892326406927b709cdaf6c384d4ababf456332Ben Murdochbool MediaDecoderJob::UpdateOutputFormat() { 6615b892326406927b709cdaf6c384d4ababf456332Ben Murdoch return false; 6625b892326406927b709cdaf6c384d4ababf456332Ben Murdoch} 6635b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 66446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MediaDecoderJob::ReleaseMediaCodecBridge() { 66546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!media_codec_bridge_) 66646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 66746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 66846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) media_codec_bridge_.reset(); 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci input_buf_index_ = -1; 67046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 67146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace media 673