// 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_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);
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
int avcodec_close(AVCodecContext *avctx);
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 av_register_bitstream_filter(AVBitStreamFilter *bsf);
AVBitStreamFilterContext *av_bitstream_filter_init(const char *name);
int av_bitstream_filter_filter(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size, int keyframe);
void av_bitstream_filter_close(AVBitStreamFilterContext *bsf);
int av_lockmgr_register(AVLockMgrOperation cb);
void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height);
int av_packet_split_side_data(AVPacket *pkt);
uint8_t *av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int *size);
void av_frame_unref(AVFrame *frame);
void av_frame_free(AVFrame **frame);
AVFrame* av_frame_alloc();
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);

// 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 av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp, int flags);
int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
void av_register_all(void);
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);
int av_opt_get_int(void *obj, const char *name, int search_flags, int64_t *out_val);


//------------------------------------------------
// 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);
void av_log_set_callback(AVLogCallback callback);
void av_log_default_callback(void *avcl, int level, const char *fmt, va_list vl);
void av_log_format_line(void *ptr, int level, const char *fmt, va_list vl, char *line, int line_size, int *print_prefix);
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);
void av_dict_free(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);
int av_image_fill_linesizes(int *linesizes, enum PixelFormat pix_fmt, int width);
AVBufferRef *av_buffer_create(uint8_t *data, int size, AVFreeOperation free, void *opaque, int flags);
int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, enum AVSampleFormat sample_fmt, const uint8_t *buf, int buf_size, int align);
void *av_buffer_get_opaque(const AVBufferRef *buf);
int av_get_cpu_flags(void);
void av_max_alloc(size_t max);
