// Copyright 2019 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 ddk.protocol.gdc;
using zx;
using zircon.device.sysmem;
using ddk.protocol.camerahwaccel;

struct GdcConfigInfo {
    handle<vmo> config_vmo;
    uint32 size;
};

[Layout = "ddk-protocol"]
protocol Gdc {
    // Registers the buffer collections and configuration which the GDC will be using
    // for this task and also the callback functions for a particular task and
    // returns a task index.
    // |input_buffer_collection| : Pool of VMOs as input to the GDC.
    // |output_buffer_collection| : Pool of VMOs as output to the GDC.
    // |config_vmos| : Static configuration for GDC is stored in this vmo for this task.
    // |callback| : This function is called when GDC is done processing the task.
    // @Returns: |task_index| : Task ID for this task.
    InitTask(zircon.device.sysmem.BufferCollectionInfo_2 input_buffer_collection,
             zircon.device.sysmem.BufferCollectionInfo_2 output_buffer_collection,
             zircon.device.sysmem.ImageFormat_2	input_image_format,
             vector<zircon.device.sysmem.ImageFormat_2> output_image_format_table,
             uint32 output_image_format_index,
             vector<GdcConfigInfo> config_vmos,
             ddk.protocol.camerahwaccel.HwAccelFrameCallback frame_callback,
	     ddk.protocol.camerahwaccel.HwAccelResChangeCallback res_callback) -> (zx.status s, uint32 task_index);

    // De-registers the task.
    RemoveTask(uint32 task_index);

    // Processes the frame at |input_buffer_index| within |input_buffer_collection|
    // in the task corresponding to |task_index| and stores the ouput in the
    // |output_buffer_collection| after applying the correct configuration.
    // After processing we call the callback registered for this task with the
    // output buffer index.
    ProcessFrame(uint32 task_index, uint32 input_buffer_index) -> (zx.status s);

    // Releases the frame |buffer_index| from the |output_buffer_collection| to be
    // used again by GDC driver again later.
    ReleaseFrame(uint32 task_index, uint32 buffer_index);

    // Set the output resolution.This operation is queued to the worker thread to be
    // performed in sequence. Once the output resolution for this Task has changed,
    // callback using the HwAccelCallback, returning the new index of the Image Format.
    SetOutputResolution(uint32 task_index, uint32 new_output_image_format_index) -> (zx.status s);
};
