blob: 8fa157d1b33d56160f6a9d9016441ad09faee27c [file] [log] [blame]
// Copyright 2016 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef STARBOARD_SHARED_STARBOARD_PLAYER_FILTER_FILTER_BASED_PLAYER_WORKER_HANDLER_H_
#define STARBOARD_SHARED_STARBOARD_PLAYER_FILTER_FILTER_BASED_PLAYER_WORKER_HANDLER_H_
#include <functional>
#include <string>
#include "starboard/common/scoped_ptr.h"
#include "starboard/configuration.h"
#include "starboard/decode_target.h"
#include "starboard/media.h"
#include "starboard/player.h"
#include "starboard/shared/starboard/player/filter/audio_renderer_internal.h"
#include "starboard/shared/starboard/player/filter/media_time_provider.h"
#include "starboard/shared/starboard/player/filter/media_time_provider_impl.h"
#include "starboard/shared/starboard/player/filter/video_renderer_internal.h"
#include "starboard/shared/starboard/player/input_buffer_internal.h"
#include "starboard/shared/starboard/player/job_queue.h"
#include "starboard/shared/starboard/player/player_worker.h"
#include "starboard/time.h"
namespace starboard {
namespace shared {
namespace starboard {
namespace player {
namespace filter {
class FilterBasedPlayerWorkerHandler : public PlayerWorker::Handler,
private JobQueue::JobOwner {
public:
FilterBasedPlayerWorkerHandler(
SbMediaVideoCodec video_codec,
SbMediaAudioCodec audio_codec,
SbDrmSystem drm_system,
const SbMediaAudioHeader* audio_header,
SbPlayerOutputMode output_mode,
SbDecodeTargetGraphicsContextProvider* provider);
private:
bool IsPunchoutMode() const;
bool Init(SbPlayer player,
UpdateMediaInfoCB update_media_info_cb,
GetPlayerStateCB get_player_state_cb,
UpdatePlayerStateCB update_player_state_cb,
UpdatePlayerErrorCB update_player_error_cb) override;
bool Seek(SbTime seek_to_time, int ticket) override;
bool WriteSample(const scoped_refptr<InputBuffer>& input_buffer,
bool* written) override;
bool WriteEndOfStream(SbMediaType sample_type) override;
bool SetPause(bool pause) override;
bool SetPlaybackRate(double playback_rate) override;
void SetVolume(double volume) override;
bool SetBounds(const PlayerWorker::Bounds& bounds) override;
void Stop() override;
void Update();
#if SB_HAS(PLAYER_ERROR_MESSAGE)
void OnError(SbPlayerError error, const std::string& error_message);
#else // SB_HAS(PLAYER_ERROR_MESSAGE)
void OnError();
#endif // SB_HAS(PLAYER_ERROR_MESSAGE)
void OnPrerolled(SbMediaType media_type);
void OnEnded(SbMediaType media_type);
SbDecodeTarget GetCurrentDecodeTarget() override;
MediaTimeProvider* GetMediaTimeProvider() const;
SbPlayer player_ = kSbPlayerInvalid;
UpdateMediaInfoCB update_media_info_cb_;
GetPlayerStateCB get_player_state_cb_;
UpdatePlayerStateCB update_player_state_cb_;
UpdatePlayerErrorCB update_player_error_cb_;
SbMediaVideoCodec video_codec_;
SbMediaAudioCodec audio_codec_;
SbDrmSystem drm_system_;
#if SB_API_VERSION >= 6
// Store a copy of |SbMediaAudioHeader::audio_specific_config| passed to the
// ctor so it is valid for the life time of the player worker.
scoped_array<int8_t> audio_specific_config_;
#endif // SB_API_VERSION >= 6
SbMediaAudioHeader audio_header_;
// |media_time_provider_impl_| is used to provide the media playback time when
// there is no audio track. In such case |audio_renderer_| will be NULL.
// When there is an audio track, |media_time_provider_impl_| will be NULL.
scoped_ptr<MediaTimeProviderImpl> media_time_provider_impl_;
scoped_ptr<AudioRenderer> audio_renderer_;
scoped_ptr<VideoRenderer> video_renderer_;
bool paused_ = false;
double playback_rate_ = 1.0;
double volume_ = 1.0;
PlayerWorker::Bounds bounds_;
JobQueue::JobToken update_job_token_;
std::function<void()> update_job_;
bool audio_prerolled_ = false;
bool video_prerolled_ = false;
bool audio_ended_ = false;
bool video_ended_ = false;
// A mutex guarding changes to the existence (e.g. creation/destruction)
// of the |video_renderer_| object. This is necessary because calls to
// GetCurrentDecodeTarget() need to be supported on arbitrary threads, and
// GetCurrentDecodeTarget() will call into |video_renderer_|. This mutex
// only needs to be held when any thread creates or resets |video_renderer_|,
// and when GetCurrentDecodeTarget() reads from it. This is because
// GetCurrentDecodeTarget() won't modify |video_renderer_|, and all other
// accesses are happening from the same thread.
::starboard::Mutex video_renderer_existence_mutex_;
SbPlayerOutputMode output_mode_;
SbDecodeTargetGraphicsContextProvider*
decode_target_graphics_context_provider_;
};
} // namespace filter
} // namespace player
} // namespace starboard
} // namespace shared
} // namespace starboard
#endif // STARBOARD_SHARED_STARBOARD_PLAYER_FILTER_FILTER_BASED_PLAYER_WORKER_HANDLER_H_