// Copyright 2020 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.
library fuchsia.media;

using zx;

@discoverable
closed protocol ProfileProvider {
    /// Register a thread as a media thread. This notifies the media subsystem that this thread
    /// should have an elevated scheduling profile applied to it in order to meet audio or video
    /// deadlines.
    ///
    /// `name` is the name of a system scheduling role to apply to the thread given by
    /// `thread_handle` -- different products may customize the underlying scheduling strategy based
    /// on the requested role. `period` is the suggested interval to be scheduled at. `period` may
    /// be zero if the thread has no preferred scheduling interval. `capacity` is the proportion of
    /// the scheduling interval the thread needs to be running to achieve good performance or to
    /// meet the scheduling deadline defined by `period`. `capacity` may be zero if the workload has
    /// no firm runtime requirements. Note that `capacity` should be a good faith estimate based on
    /// the worst case runtime the thread requires each period.  Excessive capacity requests may
    /// be rejected or result in scaling back the performance of other threads to fit resource
    /// limits.
    ///
    /// Capacity, max runtime, and period have the following relationship:
    ///
    ///   capacity = max runtime / period
    ///
    /// Where:
    ///
    ///   0 <= max runtime <= period    and    0 <= capacity <= 1
    ///
    /// For heterogeneous systems, the capacity should be planned / measured against the highest
    /// performance processor(s) in the system. The system will automatically adjust the effective
    /// capacity to account for slower processors and operating points and will avoid processors and
    /// operating points that are too slow to meet the requested scheduling parameters (provided
    /// they are reasonable).
    ///
    /// Returns the period and capacity (actually maximum runtime) that was applied, either of which
    /// may be zero to indicate not applicable.
    strict RegisterHandlerWithCapacity(resource struct {
        thread_handle zx.Handle:THREAD;
        name string:64;
        period zx.Duration;
        capacity float32;
    }) -> (struct {
        period zx.Duration;
        capacity zx.Duration;
    });

    /// Reset a thread's scheduling profile to the default.
    strict UnregisterHandler(resource struct {
        thread_handle zx.Handle:THREAD;
        name string:64;
    }) -> ();

    /// Register a memory range as being used for media processing. This notifies the media
    /// subsystem that this memory should have an elevated memory profile applied to it in order to
    /// meet audio or video deadlines.
    ///
    /// `name` is the name of a system memory role to apply to the memory given by
    /// `vmar_handle` -- different products may customize the underlying memory strategy based
    /// on the requested role.
    @available(added=15)
    strict RegisterMemoryRange(resource struct {
        vmar_handle zx.Handle:VMAR;
        name string:64;
    }) -> ();

    /// Reset a memory range's memory profile.
    @available(added=15)
    strict UnregisterMemoryRange(resource struct {
        vmar_handle zx.Handle:VMAR;
    }) -> ();
};
