// Copyright (c) 2011 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.

//------------------------------------------------
// Functions from avcodec used in chromium code.
//------------------------------------------------
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
void avcodec_free_context(AVCodecContext **avctx);
AVCodec *avcodec_find_decoder(enum AVCodecID id);
int av_new_packet(AVPacket *pkt, int size);
int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, const AVPacket *avpkt);
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
const char *avcodec_get_name(enum AVCodecID id);
void av_packet_unref(AVPacket *pkt);
void av_init_packet(AVPacket *pkt);
void avcodec_flush_buffers(AVCodecContext *avctx);
void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height);
uint8_t *av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int *size);
int av_packet_copy_props(AVPacket *dst, const AVPacket *src);
const AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);
const AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);
int avcodec_parameters_to_context(AVCodecContext *codec, const AVCodecParameters *par);
int avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);
int avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);

// RDFT functions.
RDFTContext *av_rdft_init(int nbits, enum RDFTransformType trans);
void av_rdft_calc(RDFTContext *s, FFTSample *data);
void av_rdft_end(RDFTContext *s);


//------------------------------------------------
// Functions from avformat used in chromium code.
//------------------------------------------------
void avformat_close_input(AVFormatContext **s);
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags);
AVFormatContext *avformat_alloc_context(void);
void avformat_free_context(AVFormatContext *s);
AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, AVIOReadWriteOperation read_packet, AVIOReadWriteOperation write_packet, AVIOSeekOperation seek);
int avio_close(AVIOContext *s);


//------------------------------------------------
// Functions from avutil used in chromium code.
//------------------------------------------------
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt);
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq);
void *av_malloc(size_t size);
void av_free(void *ptr);
void av_log_set_level(int level);
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);
void av_dict_free(AVDictionary **m);
int av_dict_count(const AVDictionary *m);
AVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags);
int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align);
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx);
AVBufferRef *av_buffer_create(uint8_t *data, int size, AVFreeOperation free, void *opaque, int flags);
void *av_buffer_get_opaque(const AVBufferRef *buf);
int av_get_cpu_flags(void);
void av_force_cpu_flags(int flags);
void av_max_alloc(size_t max);
int av_strerror(int errnum, char *errbuf, size_t errbuf_size);
AVFrame *av_frame_clone(const AVFrame *src);
void av_frame_unref(AVFrame *frame);
void av_frame_free(AVFrame **frame);
AVFrame* av_frame_alloc();
