blob: 8132b6135ec6e0eb84cb94f8cd7d20282c67aac5 [file] [log] [blame]
/*
* Copyright 2020 The libgav1 Authors
*
* 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 LIBGAV1_SRC_GAV1_FRAME_BUFFER_H_
#define LIBGAV1_SRC_GAV1_FRAME_BUFFER_H_
// All the declarations in this file are part of the public ABI. This file may
// be included by both C and C++ files.
#if defined(__cplusplus)
#include <cstddef>
#include <cstdint>
#else
#include <stddef.h>
#include <stdint.h>
#endif // defined(__cplusplus)
#include "gav1/decoder_buffer.h"
#include "gav1/status_code.h"
#include "gav1/symbol_visibility.h"
// The callback functions use the C linkage conventions.
#if defined(__cplusplus)
extern "C" {
#endif
// This structure represents an allocated frame buffer.
typedef struct Libgav1FrameBuffer {
// In the |plane| and |stride| arrays, the elements at indexes 0, 1, and 2
// are for the Y, U, and V planes, respectively.
uint8_t* plane[3]; // Pointers to the frame (excluding the borders) in the
// data buffers.
int stride[3]; // Row strides in bytes.
void* private_data; // Frame buffer's private data. Available for use by the
// release frame buffer callback. Also copied to the
// |buffer_private_data| field of DecoderBuffer for use
// by the consumer of a DecoderBuffer.
} Libgav1FrameBuffer;
// This callback is invoked by the decoder to provide information on the
// subsequent frames in the video, until the next invocation of this callback
// or the end of the video.
//
// |width| and |height| are the maximum frame width and height in pixels.
// |left_border|, |right_border|, |top_border|, and |bottom_border| are the
// maximum left, right, top, and bottom border sizes in pixels.
// |stride_alignment| specifies the alignment of the row stride in bytes.
//
// Returns kLibgav1StatusOk on success, an error status on failure.
//
// NOTE: This callback may be omitted if the information is not useful to the
// application.
typedef Libgav1StatusCode (*Libgav1FrameBufferSizeChangedCallback)(
void* callback_private_data, int bitdepth, Libgav1ImageFormat image_format,
int width, int height, int left_border, int right_border, int top_border,
int bottom_border, int stride_alignment);
// This callback is invoked by the decoder to allocate a frame buffer, which
// consists of three data buffers, for the Y, U, and V planes, respectively.
//
// The callback must set |frame_buffer->plane[i]| to point to the data buffers
// of the planes, and set |frame_buffer->stride[i]| to the row strides of the
// planes. If |image_format| is kLibgav1ImageFormatMonochrome400, the callback
// should set |frame_buffer->plane[1]| and |frame_buffer->plane[2]| to a null
// pointer and set |frame_buffer->stride[1]| and |frame_buffer->stride[2]| to
// 0. The callback may set |frame_buffer->private_data| to a value that will
// be useful to the release frame buffer callback and the consumer of a
// DecoderBuffer.
//
// Returns kLibgav1StatusOk on success, an error status on failure.
// |width| and |height| are the frame width and height in pixels.
// |left_border|, |right_border|, |top_border|, and |bottom_border| are the
// left, right, top, and bottom border sizes in pixels. |stride_alignment|
// specifies the alignment of the row stride in bytes.
typedef Libgav1StatusCode (*Libgav1GetFrameBufferCallback)(
void* callback_private_data, int bitdepth, Libgav1ImageFormat image_format,
int width, int height, int left_border, int right_border, int top_border,
int bottom_border, int stride_alignment, Libgav1FrameBuffer* frame_buffer);
// After a frame buffer is allocated, the decoder starts to write decoded video
// to the frame buffer. When the frame buffer is ready for consumption, it is
// made available to the application in a Decoder::DequeueFrame() call.
// Afterwards, the decoder may continue to use the frame buffer in read-only
// mode. When the decoder is finished using the frame buffer, it notifies the
// application by calling the Libgav1ReleaseFrameBufferCallback.
// This callback is invoked by the decoder to release a frame buffer.
typedef void (*Libgav1ReleaseFrameBufferCallback)(void* callback_private_data,
void* buffer_private_data);
// Libgav1ComputeFrameBufferInfo() and Libgav1SetFrameBuffer() are intended to
// help clients implement frame buffer callbacks using memory buffers. First,
// call Libgav1ComputeFrameBufferInfo(). If it succeeds, allocate y_buffer of
// size info.y_buffer_size and allocate u_buffer and v_buffer, both of size
// info.uv_buffer_size. Finally, pass y_buffer, u_buffer, v_buffer, and
// buffer_private_data to Libgav1SetFrameBuffer().
// This structure contains information useful for allocating memory for a frame
// buffer.
typedef struct Libgav1FrameBufferInfo {
size_t y_buffer_size; // Size in bytes of the Y buffer.
size_t uv_buffer_size; // Size in bytes of the U or V buffer.
// The following fields are consumed by Libgav1SetFrameBuffer(). Do not use
// them directly.
int y_stride; // Row stride in bytes of the Y buffer.
int uv_stride; // Row stride in bytes of the U or V buffer.
size_t y_plane_offset; // Offset in bytes of the frame (excluding the
// borders) in the Y buffer.
size_t uv_plane_offset; // Offset in bytes of the frame (excluding the
// borders) in the U or V buffer.
int stride_alignment; // The stride_alignment argument passed to
// Libgav1ComputeFrameBufferInfo().
} Libgav1FrameBufferInfo;
// Computes the information useful for allocating memory for a frame buffer.
// On success, stores the output in |info|.
LIBGAV1_PUBLIC Libgav1StatusCode Libgav1ComputeFrameBufferInfo(
int bitdepth, Libgav1ImageFormat image_format, int width, int height,
int left_border, int right_border, int top_border, int bottom_border,
int stride_alignment, Libgav1FrameBufferInfo* info);
// Sets the |frame_buffer| struct.
LIBGAV1_PUBLIC Libgav1StatusCode Libgav1SetFrameBuffer(
const Libgav1FrameBufferInfo* info, uint8_t* y_buffer, uint8_t* u_buffer,
uint8_t* v_buffer, void* buffer_private_data,
Libgav1FrameBuffer* frame_buffer);
#if defined(__cplusplus)
} // extern "C"
// Declare type aliases for C++.
namespace libgav1 {
using FrameBuffer = Libgav1FrameBuffer;
using FrameBufferSizeChangedCallback = Libgav1FrameBufferSizeChangedCallback;
using GetFrameBufferCallback = Libgav1GetFrameBufferCallback;
using ReleaseFrameBufferCallback = Libgav1ReleaseFrameBufferCallback;
using FrameBufferInfo = Libgav1FrameBufferInfo;
inline StatusCode ComputeFrameBufferInfo(int bitdepth, ImageFormat image_format,
int width, int height, int left_border,
int right_border, int top_border,
int bottom_border,
int stride_alignment,
FrameBufferInfo* info) {
return Libgav1ComputeFrameBufferInfo(bitdepth, image_format, width, height,
left_border, right_border, top_border,
bottom_border, stride_alignment, info);
}
inline StatusCode SetFrameBuffer(const FrameBufferInfo* info, uint8_t* y_buffer,
uint8_t* u_buffer, uint8_t* v_buffer,
void* buffer_private_data,
FrameBuffer* frame_buffer) {
return Libgav1SetFrameBuffer(info, y_buffer, u_buffer, v_buffer,
buffer_private_data, frame_buffer);
}
} // namespace libgav1
#endif // defined(__cplusplus)
#endif // LIBGAV1_SRC_GAV1_FRAME_BUFFER_H_