// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_RENDERER_RASTERIZER_LIB_EXPORTED_VIDEO_H_
#define COBALT_RENDERER_RASTERIZER_LIB_EXPORTED_VIDEO_H_

#include "starboard/export.h"
#include "starboard/types.h"

#ifdef __cplusplus
extern "C" {
#endif

// Functions to be called to set callbacks to receive updates to video rendering
// parameters. By default, these callbacks are not set and warnings will be
// when an unhandled parameter change happens. To unset them again, any of these
// setter functions can be called with a null callback function pointer.

typedef enum {
  kCbLibVideoProjectionTypeNone = 0,  // When no offscreen video is playing.
  kCbLibVideoProjectionTypeRectangular = 1,
  kCbLibVideoProjectionTypeMesh = 2,
} CbLibVideoProjectionType;

typedef enum {
  kCbLibVideoStereoModeMono = 0,
  kCbLibVideoStereoModeStereoLeftRight = 1,
  kCbLibVideoStereoModeStereoTopBottom = 2,
  kCbLibVideoStereoModeStereoLeftRightUnadjustedCoordinates = 3,
} CbLibVideoStereoMode;

// If projection_type is Rectangular or Mesh, this signals the start of off-
// screen video playback and also sets the stereo_mode of the video texture.
// If it is None, this signals the end of playback and stereo_mode can be
// ignored.
typedef void (*CbLibVideoUpdateProjectionTypeAndStereoModeCallback)(
    void* context, CbLibVideoProjectionType projection_type,
    CbLibVideoStereoMode stereo_mode);

SB_EXPORT_PLATFORM void CbLibVideoSetOnUpdateProjectionTypeAndStereoMode(
    void* context,
    CbLibVideoUpdateProjectionTypeAndStereoModeCallback callback);

typedef enum {
  kCbLibVideoMeshDrawModeTriangles = 0,
  kCbLibVideoMeshDrawModeTriangleStrip = 1,
  kCbLibVideoMeshDrawModeTriangleFan = 2,
} CbLibVideoMeshDrawMode;

typedef struct {
  int vertex_count;
  CbLibVideoMeshDrawMode draw_mode;
  // Memory owned and deleted by Cobalt. The array holds |count| tuples of
  // interleaved position and texture coordinates in single precision floating
  // point numbers, X, Y, Z, U, V.
  const float* vertices;
} CbLibVideoMesh;

// Called when two new video meshes are detected; each should be applied to the
// view of the corresponding eye on stereo rendering.
typedef void (*CbLibVideoUpdateMeshesCallback)(void* context,
                                               CbLibVideoMesh left_eye_mesh,
                                               CbLibVideoMesh right_eye_mesh);

SB_EXPORT_PLATFORM void CbLibVideoSetOnUpdateMeshes(
    void* context, CbLibVideoUpdateMeshesCallback callback);

// Called to set the RGB video texture ID.
typedef void (*CbLibVideoUpdateRgbTextureIdCallback)(void* context, int id);

SB_EXPORT_PLATFORM void CbLibVideoSetOnUpdateRgbTextureId(
    void* context, CbLibVideoUpdateRgbTextureIdCallback callback);

// Called to set aspect ratio of the video (width over height).
typedef void (*CbLibVideoUpdateAspectRatioCallback)(void* context,
                                                    float aspect_ratio);

SB_EXPORT_PLATFORM void CbLibVideoSetOnUpdateAspectRatio(
    void* context, CbLibVideoUpdateAspectRatioCallback callback);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // COBALT_RENDERER_RASTERIZER_LIB_EXPORTED_VIDEO_H_
