libavcodec/internal.h
dbbec0c2
 /*
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 /**
ba87f080
  * @file
dbbec0c2
  * common internal api header.
  */
 
 #ifndef AVCODEC_INTERNAL_H
 #define AVCODEC_INTERNAL_H
 
a05aa821
 #include <stdint.h>
f3a29b75
 
91a28b0e
 #include "libavutil/mathematics.h"
f3a29b75
 #include "libavutil/pixfmt.h"
a05aa821
 #include "avcodec.h"
 
bb6941af
 #define FF_SANE_NB_CHANNELS 128U
 
f3a29b75
 typedef struct InternalBuffer {
0eea2129
     uint8_t *base[AV_NUM_DATA_POINTERS];
     uint8_t *data[AV_NUM_DATA_POINTERS];
     int linesize[AV_NUM_DATA_POINTERS];
f3a29b75
     int width;
     int height;
716d413c
     enum AVPixelFormat pix_fmt;
f3a29b75
 } InternalBuffer;
 
 typedef struct AVCodecInternal {
     /**
      * internal buffer count
      * used by default get/release/reget_buffer().
      */
     int buffer_count;
 
     /**
      * internal buffers
      * used by default get/release/reget_buffer().
      */
     InternalBuffer *buffer;
 
     /**
      * Whether the parent AVCodecContext is a copy of the context which had
      * init() called on it.
      * This is used by multithreading - shared tables and picture pointers
      * should be freed from the original context only.
      */
     int is_copy;
b2c75b6e
 
5a4e9fe8
 #if FF_API_OLD_ENCODE_AUDIO
b2c75b6e
     /**
      * Internal sample count used by avcodec_encode_audio() to fabricate pts.
      * Can be removed along with avcodec_encode_audio().
      */
     int sample_count;
 #endif
740b9ff4
 
     /**
a5117a24
      * An audio frame with less than required samples has been submitted and
      * padded with silence. Reject all subsequent frames.
      */
     int last_audio_frame;
61930bd0
 
     /**
e57c4706
      * The data for the last allocated audio frame.
      * Stored here so we can free it.
      */
     uint8_t *audio_data;
83db6cb5
 
     /**
740b9ff4
      * temporary buffer used for encoders to store their bitstream
      */
     uint8_t *byte_buffer;
     unsigned int byte_buffer_size;
fde1bc64
 
     void *frame_thread_encoder;
2fe18640
 
     /**
      * Number of audio samples to skip at the start of the next decoded frame
      */
     int skip_samples;
f3a29b75
 } AVCodecInternal;
 
84626b36
 struct AVCodecDefault {
     const uint8_t *key;
     const uint8_t *value;
 };
 
dbbec0c2
 /**
49bd8e4b
  * Return the hardware accelerated codec for codec codec_id and
bf7e799c
  * pixel format pix_fmt.
a05aa821
  *
  * @param codec_id the codec to match
  * @param pix_fmt the pixel format to match
  * @return the hardware accelerated codec, or NULL if none was found.
  */
716d413c
 AVHWAccel *ff_find_hwaccel(enum AVCodecID codec_id, enum AVPixelFormat pix_fmt);
a05aa821
 
9e2e8214
 /**
  * Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
  * If there is no such matching pair then size is returned.
  */
6c060b55
 int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b);
 
0842d589
 unsigned int avpriv_toupper4(unsigned int x);
603a5f04
 
b93cb838
 /**
  * does needed setup of pkt_pts/pos and such for (re)get_buffer();
  */
44bd69e9
 void ff_init_buffer_info(AVCodecContext *s, AVFrame *frame);
b93cb838
 
a53b144e
 
 void avpriv_color_frame(AVFrame *frame, const int color[4]);
 
c4ba5198
 /**
  * Remove and free all side data from packet.
  */
 void ff_packet_free_side_data(AVPacket *pkt);
 
25fec859
 extern volatile int ff_avcodec_locked;
 int ff_lock_avcodec(AVCodecContext *log_ctx);
 int ff_unlock_avcodec(void);
 
2d1b6fb7
 int avpriv_lock_avformat(void);
 int avpriv_unlock_avformat(void);
 
4df30f71
 /**
  * Maximum size in bytes of extradata.
  * This value was chosen such that every bit of the buffer is
  * addressable by a 32-bit signed integer as used by get_bits.
  */
 #define FF_MAX_EXTRADATA_SIZE ((1 << 28) - FF_INPUT_BUFFER_PADDING_SIZE)
 
b2c75b6e
 /**
  * Check AVPacket size and/or allocate data.
  *
  * Encoders supporting AVCodec.encode2() can use this as a convenience to
  * ensure the output packet data is large enough, whether provided by the user
  * or allocated in this function.
  *
00663de3
  * @param avctx   the AVCodecContext of the encoder
b2c75b6e
  * @param avpkt   the AVPacket
  *                If avpkt->data is already set, avpkt->size is checked
  *                to ensure it is large enough.
  *                If avpkt->data is NULL, a new buffer is allocated.
1a670973
  *                avpkt->size is set to the specified size.
b2c75b6e
  *                All other AVPacket fields will be reset with av_init_packet().
  * @param size    the minimum required packet size
  * @return        0 on success, negative error code on failure
  */
00663de3
 int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size);
 
b2c75b6e
 int ff_alloc_packet(AVPacket *avpkt, int size);
 
91a28b0e
 /**
  * Rescale from sample rate to AVCodecContext.time_base.
  */
 static av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx,
                                                         int64_t samples)
 {
6952301f
     if(samples == AV_NOPTS_VALUE)
         return AV_NOPTS_VALUE;
91a28b0e
     return av_rescale_q(samples, (AVRational){ 1, avctx->sample_rate },
                         avctx->time_base);
 }
 
594d4d5d
 /**
  * Get a buffer for a frame. This is a wrapper around
  * AVCodecContext.get_buffer() and should be used instead calling get_buffer()
  * directly.
  */
 int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame);
 
59a4b735
 int ff_thread_can_start_frame(AVCodecContext *avctx);
 
0c851e46
 int ff_get_logical_cpus(AVCodecContext *avctx);
 
bafa1c7f
 int avpriv_h264_has_num_reorder_frames(AVCodecContext *avctx);
 
a3a97129
 void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, uint8_t *mbskip_table,
                          uint8_t *visualization_buffer[3], int *low_delay,
                          int mb_width, int mb_height, int mb_stride, int quarter_sample);
 
2470851f
 /**
  * Call avcodec_open2 recursively by decrementing counter, unlocking mutex,
  * calling the function and then restoring again. Assumes the mutex is
  * already locked
  */
 int ff_codec_open2_recursive(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);
 
 /**
  * Call avcodec_close recursively, counterpart to avcodec_open2_recursive.
  */
 int ff_codec_close_recursive(AVCodecContext *avctx);
 
36e61e24
 /**
  * Finalize buf into extradata and set its size appropriately.
  */
67286fa9
 int avpriv_bprint_to_extradata(AVCodecContext *avctx, struct AVBPrint *buf);
36e61e24
 
bf90ef03
 AVDictionary **ff_frame_get_metadatap(AVFrame *frame);
 
dbbec0c2
 #endif /* AVCODEC_INTERNAL_H */