blob: bc9ad5a71858713d6ad21eb528e4916970c955eb [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <vector>
#include "garnet/bin/flog_viewer/accumulator.h"
#include "garnet/bin/flog_viewer/channel_handler.h"
#include "garnet/bin/flog_viewer/counted.h"
#include "garnet/bin/flog_viewer/handlers/media_packet_consumer.h"
#include "garnet/bin/flog_viewer/handlers/media_timeline_control_point.h"
#include "garnet/bin/flog_viewer/tracked.h"
#include "lib/media/fidl/logs/media_renderer_channel.fidl.h"
#include "lib/media/timeline/timeline_rate.h"
namespace flog {
namespace handlers {
class MediaRendererAccumulator;
// Handler for MediaRendererChannel messages.
class MediaRenderer : public ChannelHandler,
public media::logs::MediaRendererChannel {
public:
MediaRenderer(const std::string& format);
~MediaRenderer() override;
std::shared_ptr<Accumulator> GetAccumulator() override;
protected:
// ChannelHandler overrides.
void HandleMessage(fidl::Message* message) override;
private:
// MediaRendererChannel implementation.
void BoundAs(uint64_t koid) override;
void Config(fidl::Array<media::MediaTypeSetPtr> supported_types,
uint64_t consumer_address,
uint64_t timeline_control_point_address) override;
void SetMediaType(media::MediaTypePtr type) override;
void PtsRate(uint32_t ticks, uint32_t seconds) override;
void EngagePacket(int64_t current_pts,
int64_t packet_pts,
uint64_t packet_label) override;
void RenderRange(int64_t pts, uint32_t duration) override;
private:
MediaTimelineControlPoint* GetTimelineControlPoint();
MediaPacketConsumer* GetConsumer();
void RecordPacketEarliness(MediaPacketConsumerAccumulator::Packet* packet,
MediaTimelineControlPoint* timeline_control_point);
media::logs::MediaRendererChannelStub stub_;
std::shared_ptr<MediaRendererAccumulator> accumulator_;
media::TimelineRate audio_frame_rate_;
uint32_t audio_frame_size_;
int64_t expected_range_pts_ = media::MediaPacket::kNoTimestamp;
uint64_t earliness_prev_packet_label_ = 0;
bool end_of_stream_ = false;
bool was_paused_ = true;
};
// Status of a media renderer as understood by MediaRenderer.
class MediaRendererAccumulator : public Accumulator {
public:
MediaRendererAccumulator();
~MediaRendererAccumulator() override;
// Accumulator overrides.
void Print(std::ostream& os) override;
private:
fidl::Array<media::MediaTypeSetPtr> supported_types_;
std::shared_ptr<Channel> consumer_channel_;
std::shared_ptr<Channel> timeline_control_point_channel_;
media::MediaTypePtr type_;
media::TimelineRate pts_rate_ = media::TimelineRate::NsPerSecond;
Counted preroll_packets_;
Counted preroll_renders_;
Tracked packet_earliness_ns_;
Counted starved_no_packet_;
Tracked starved_ns_;
Counted missing_packets_;
Tracked gaps_in_frames_before_first_;
Tracked gaps_in_frames_no_packet_;
Tracked gaps_in_frames_between_packets_;
Tracked gaps_in_frames_end_of_stream_;
friend class MediaRenderer;
};
} // namespace handlers
} // namespace flog