blob: 126118574cfc915c60b80a913dc30cc64776075b [file] [log] [blame]
// Copyright 2016 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 MOJO_SERVICES_MEDIA_COMMON_CPP_VIDEO_RENDERER_H_
#define MOJO_SERVICES_MEDIA_COMMON_CPP_VIDEO_RENDERER_H_
#include <memory>
#include <queue>
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/services/geometry/interfaces/geometry.mojom.h"
#include "mojo/services/media/common/cpp/media_packet_consumer_base.h"
#include "mojo/services/media/common/cpp/timeline_function.h"
#include "mojo/services/media/common/cpp/video_converter.h"
#include "mojo/services/media/common/interfaces/media_transport.mojom.h"
#include "mojo/services/media/core/interfaces/media_renderer.mojom.h"
namespace mojo {
namespace media {
// Implements MediaRenderer for an app that wants to show video.
class VideoRenderer : public MediaPacketConsumerBase,
public MediaRenderer,
public MediaTimelineControlPoint,
public TimelineConsumer {
public:
VideoRenderer();
~VideoRenderer() override;
void Bind(InterfaceRequest<MediaRenderer> renderer_request);
// Get the size of the video to be rendered.
Size GetSize();
// Gets an RGBA video frame corresponding to the specified reference time.
void GetRgbaFrame(uint8_t* rgba_buffer,
const Size& rgba_buffer_size,
int64_t reference_time);
private:
// MediaRenderer implementation.
void GetSupportedMediaTypes(
const GetSupportedMediaTypesCallback& callback) override;
void SetMediaType(MediaTypePtr media_type) override;
void GetPacketConsumer(
InterfaceRequest<MediaPacketConsumer> packet_consumer_request) override;
void GetTimelineControlPoint(InterfaceRequest<MediaTimelineControlPoint>
control_point_request) override;
// MediaPacketConsumerBase overrides.
void OnPacketSupplied(
std::unique_ptr<SuppliedPacket> supplied_packet) override;
void OnFlushRequested(const FlushCallback& callback) override;
void OnFailure() override;
// MediaTimelineControlPoint implementation.
void GetStatus(uint64_t version_last_seen,
const GetStatusCallback& callback) override;
void GetTimelineConsumer(
InterfaceRequest<TimelineConsumer> timeline_consumer_request) override;
void Prime(const PrimeCallback& callback) override;
// TimelineConsumer implementation.
void SetTimelineTransform(
TimelineTransformPtr timeline_transform,
const SetTimelineTransformCallback& callback) override;
// Clears the pending timeline function and calls its associated callback
// with the indicated completed status.
void ClearPendingTimelineFunction(bool completed);
// Apply a pending timeline change if there is one an it's due.
void MaybeApplyPendingTimelineChange(int64_t reference_time);
// Publishes end-of-stream as needed.
void MaybePublishEndOfStream();
// Sends status updates to waiting callers of GetStatus.
void SendStatusUpdates();
// Calls the callback with the current status.
void CompleteGetStatus(const GetStatusCallback& callback);
Binding<MediaRenderer> renderer_binding_;
Binding<MediaTimelineControlPoint> control_point_binding_;
Binding<TimelineConsumer> timeline_consumer_binding_;
std::queue<std::unique_ptr<SuppliedPacket>> packet_queue_;
TimelineFunction current_timeline_function_;
TimelineFunction pending_timeline_function_;
SetTimelineTransformCallback set_timeline_transform_callback_;
int64_t end_of_stream_pts_ = kUnspecifiedTime;
bool end_of_stream_published_ = false;
uint64_t status_version_ = 1u;
std::vector<GetStatusCallback> pending_status_callbacks_;
VideoConverter converter_;
};
} // namespace media
} // namespace moj
#endif // MOJO_SERVICES_MEDIA_COMMON_CPP_VIDEO_RENDERER_H_