// Copyright 2021 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.

module media.mojom;

import "media/mojo/mojom/media_types.mojom";
import "media/mojo/mojom/video_decoder.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "ui/gfx/mojom/color_space.mojom";

[Native]
struct VideoDecodeAcceleratorConfig;

// Used by media clients to acquire new VideoDecoder instances from the GPU
// process.
interface GpuAcceleratedVideoDecoderProvider {
  // Creates and initializes a new hardware video decoder instance.
  [Sync]
  CreateAcceleratedVideoDecoder(
      VideoDecodeAcceleratorConfig config,
      pending_associated_receiver<GpuAcceleratedVideoDecoder> receiver,
      pending_associated_remote<GpuAcceleratedVideoDecoderClient> client)
      => (bool success);
};

[Native]
struct BitstreamBuffer;

// Links a set of texture IDs to a given PictureBuffer ID.
struct PictureBufferAssignment {
  int32 buffer_id;
  array<uint32> texture_ids;
};

// Interface to control a single hardware video decoder instance. This is
// implemented in the GPU process and called by renderer clients.
interface GpuAcceleratedVideoDecoder {
  // Sends an input buffer for decoding.
  Decode(BitstreamBuffer buffer);

  // Give texture IDs for the textures to use for output.
  AssignPictureBuffers(array<PictureBufferAssignment> assignments);

  // Indicates that the given picture buffer can be recycled for subsequent
  // decode operations.
  ReusePictureBuffer(int32 picture_buffer_id);

  // Flushes the decoder.
  Flush() => ();

  // Resets the decoder.
  Reset() => ();

  // Sends overlay info to the decoder.
  SetOverlayInfo(OverlayInfo overlay_info);
};

// Client interface corresponding with a single AcceleratedVideoDecoder
// instance. This is implemented by renderer clients and called from by the GPU
// process.
interface GpuAcceleratedVideoDecoderClient {
  // Notifies the client that deferred initialization has completed.
  OnInitializationComplete(bool success);

  // Notifies the client that an input buffer has been consumed.
  OnBitstreamBufferProcessed(int32 buffer_id);

  // Allocates video frames for decoder output.
  OnProvidePictureBuffers(
      uint32 num_frames, VideoPixelFormat format, uint32 num_textures_per_frame,
      gfx.mojom.Size buffer_size, uint32 texture_target);

  // Notifies the client that a picture is ready.
  OnPictureReady(PictureReadyParams params);

  // Notifies the client that a picture is ready and the buffer does not need to
  // be passed back to the decoder.
  OnDismissPictureBuffer(int32 buffer_id);

  // Notifies the client of an error encountered by the decoder.
  OnError(uint32 error_id);
};

// Parameters passed to AcceleratedVideoDecoderClient.OnPictureReady from the
// GPU process to the client renderer.
struct PictureReadyParams {
  int32 picture_buffer_id;
  int32 bitstream_buffer_id;
  gfx.mojom.Rect visible_rect;
  gfx.mojom.ColorSpace color_space;
  bool allow_overlay;
  bool read_lock_fences_enabled;
  bool size_changed;
  bool surface_texture;
  bool wants_promotion_hint;
};

