blob: 4d70b66e178ad33abca54e83ca77ae7be5dda9bd [file] [log] [blame]
// Copyright 2018 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.
// This class defines an interface for dispatching calls to the ffmpeg
// libraries.
#ifndef STARBOARD_SHARED_FFMPEG_FFMPEG_DISPATCH_H_
#define STARBOARD_SHARED_FFMPEG_FFMPEG_DISPATCH_H_
#include "starboard/common/mutex.h"
#include "starboard/types.h"
struct AVCodec;
struct AVCodecContext;
struct AVDictionary;
struct AVFrame;
struct AVPacket;
namespace starboard {
namespace shared {
namespace ffmpeg {
class FFMPEGDispatch {
public:
FFMPEGDispatch();
~FFMPEGDispatch();
static FFMPEGDispatch* GetInstance();
// Register an ffmpeg decoder specialization for the given combination of
// major versions of the libavcodec, libavformat, and libavutil libraries.
// Returns true if the specialization did not exist yet, or if it matched
// an already existing registration.
static bool RegisterSpecialization(int specialization,
int avcodec,
int avformat,
int avutil);
bool is_valid() const;
unsigned (*avutil_version)(void);
void* (*av_malloc)(size_t size);
void (*av_freep)(void* ptr);
AVFrame* (*av_frame_alloc)(void);
#if LIBAVUTIL_VERSION_INT >= LIBAVUTIL_VERSION_52_8
void (*av_frame_free)(AVFrame** frame);
#endif // LIBAVUTIL_VERSION_INT >= LIBAVUTIL_VERSION_52_8
void (*av_frame_unref)(AVFrame* frame);
int (*av_samples_get_buffer_size)(int* linesize,
int nb_channels,
int nb_samples,
int sample_fmt,
int align);
int (*av_opt_set_int)(void* obj,
const char* name,
int64_t val,
int search_flags);
int (*av_image_check_size)(unsigned int w,
unsigned int h,
int log_offset,
void* log_ctx);
void* (*av_buffer_create)(uint8_t* data,
int size,
void (*free)(void* opaque, uint8_t* data),
void* opaque,
int flags);
unsigned (*avcodec_version)(void);
AVCodecContext* (*avcodec_alloc_context3)(const AVCodec* codec);
#if LIBAVUTIL_VERSION_INT >= LIBAVUTIL_VERSION_52_8
void (*avcodec_free_context)(AVCodecContext** avctx);
#endif // LIBAVUTIL_VERSION_INT >= LIBAVUTIL_VERSION_52_8
AVCodec* (*avcodec_find_decoder)(int id);
int (*avcodec_close)(AVCodecContext* avctx);
int (*avcodec_open2)(AVCodecContext* avctx,
const AVCodec* codec,
AVDictionary** options);
void (*av_init_packet)(AVPacket* pkt);
int (*avcodec_decode_audio4)(AVCodecContext* avctx,
AVFrame* frame,
int* got_frame_ptr,
const AVPacket* avpkt);
int (*avcodec_decode_video2)(AVCodecContext* avctx,
AVFrame* picture,
int* got_picture_ptr,
const AVPacket* avpkt);
void (*avcodec_flush_buffers)(AVCodecContext* avctx);
AVFrame* (*avcodec_alloc_frame)(void);
void (*avcodec_get_frame_defaults)(AVFrame* frame);
void (*avcodec_align_dimensions2)(AVCodecContext* avctx,
int* width, int* height,
int linesize_align[]);
unsigned (*avformat_version)(void);
void (*av_register_all)(void);
int specialization_version() const;
// In Ffmpeg, the calls to avcodec_open2() and avcodec_close() are not
// synchronized internally so it is the responsibility of its user to ensure
// that these calls don't overlap. The following functions acquires a lock
// internally before calling avcodec_open2() and avcodec_close() to enforce
// this.
int OpenCodec(AVCodecContext* codec_context, const AVCodec* codec);
void CloseCodec(AVCodecContext* codec_context);
void FreeFrame(AVFrame** frame);
void FreeContext(AVCodecContext** avctx);
};
} // namespace ffmpeg
} // namespace shared
} // namespace starboard
#endif // STARBOARD_SHARED_FFMPEG_FFMPEG_DISPATCH_H_