FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
Data Structures | Macros | Functions | Variables
mpeg4videoenc.c File Reference
#include "libavutil/attributes.h"
#include "libavutil/log.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
#include "libavutil/thread.h"
#include "codec_internal.h"
#include "mpegvideo.h"
#include "h263.h"
#include "h263enc.h"
#include "mpeg4video.h"
#include "mpeg4videodata.h"
#include "mpeg4videodefs.h"
#include "mpeg4videoenc.h"
#include "mpegvideoenc.h"
#include "profiles.h"
#include "put_bits.h"
#include "version.h"

Go to the source code of this file.

Data Structures

struct  Mpeg4EncContext
 

Macros

#define UNI_MPEG4_ENC_INDEX(last, run, level)   ((last) * 128 * 64 + (run) * 128 + (level))
 
#define VLC_NUM_CODES   102
 
#define OFFSET(x)   offsetof(MPVEncContext, x)
 
#define VE   AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 

Functions

static Mpeg4EncContextmainctx_to_mpeg4 (MPVMainEncContext *m)
 
static int get_block_rate (MPVEncContext *const s, int16_t block[64], int block_last_index, const uint8_t scantable[64])
 Return the number of bits that encoding the 8x8 block in block would need. More...
 
static void restore_ac_coeffs (MPVEncContext *const s, int16_t block[6][64], const int dir[6], const uint8_t *st[6], const int zigzag_last_index[6])
 Restore the ac coefficients in block that have been changed by decide_ac_pred(). More...
 
static int decide_ac_pred (MPVEncContext *const s, int16_t block[6][64], const int dir[6], const uint8_t *st[6], int zigzag_last_index[6])
 Return the optimal value (0 or 1) for the ac_pred element for the given MB in MPEG-4. More...
 
void ff_clean_mpeg4_qscales (MPVEncContext *const s)
 modify mb_type & qscale so that encoding is actually possible in MPEG-4 More...
 
static void mpeg4_encode_dc (PutBitContext *s, int level, int n)
 Encode the dc value. More...
 
static void mpeg4_encode_ac_coeffs (const int16_t block[64], const int last_index, int i, const uint8_t *const scan_table, PutBitContext *const ac_pb, const uint32_t *const bits_tab, const uint8_t *const len_tab)
 Encode the AC coefficients of an 8x8 block. More...
 
static void mpeg4_encode_blocks_inter (MPVEncContext *const s, const int16_t block[6][64], PutBitContext *ac_pb)
 
static void mpeg4_encode_blocks_intra (MPVEncContext *const s, const int16_t block[6][64], const int intra_dc[6], const uint8_t *const *scan_table, PutBitContext *dc_pb, PutBitContext *ac_pb)
 
static int get_b_cbp (MPVEncContext *const s, int16_t block[6][64], int motion_x, int motion_y, int mb_type)
 
static void mpeg4_encode_mb (MPVEncContext *const s, int16_t block[][64], int motion_x, int motion_y)
 
void ff_mpeg4_stuffing (PutBitContext *pbc)
 add MPEG-4 stuffing bits (01...1) More...
 
void ff_set_mpeg4_time (MPVEncContext *const s)
 
static void mpeg4_encode_gop_header (MPVMainEncContext *const m)
 
static void mpeg4_encode_visual_object_header (MPVMainEncContext *const m)
 
static void mpeg4_encode_vol_header (Mpeg4EncContext *const m4, int vo_number, int vol_number)
 
static int mpeg4_encode_picture_header (MPVMainEncContext *const m)
 
static av_cold void init_uni_dc_tab (void)
 
static av_cold void init_uni_mpeg4_rl_tab (RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab)
 
static av_cold void mpeg4_encode_init_static (void)
 
static av_cold int encode_init (AVCodecContext *avctx)
 
void ff_mpeg4_init_partitions (MPVEncContext *const s)
 
void ff_mpeg4_merge_partitions (MPVEncContext *const s)
 
void ff_mpeg4_encode_video_packet_header (MPVEncContext *const s)
 

Variables

static uint8_t fcode_tab [MAX_MV *2+1]
 Minimal fcode that a motion vector component would need. More...
 
static uint8_t uni_DCtab_lum_len [512]
 
static uint8_t uni_DCtab_chrom_len [512]
 
static uint16_t uni_DCtab_lum_bits [512]
 
static uint16_t uni_DCtab_chrom_bits [512]
 
static uint32_t uni_mpeg4_intra_rl_bits [64 *64 *2 *2]
 
static uint8_t uni_mpeg4_intra_rl_len [64 *64 *2 *2]
 
static uint32_t uni_mpeg4_inter_rl_bits [64 *64 *2 *2]
 
static uint8_t uni_mpeg4_inter_rl_len [64 *64 *2 *2]
 
static const int dquant_code [5] = { 1, 0, 9, 2, 3 }
 
static const AVOption options []
 
static const AVClass mpeg4enc_class
 
const FFCodec ff_mpeg4_encoder
 

Macro Definition Documentation

◆ UNI_MPEG4_ENC_INDEX

#define UNI_MPEG4_ENC_INDEX (   last,
  run,
  level 
)    ((last) * 128 * 64 + (run) * 128 + (level))

Definition at line 63 of file mpeg4videoenc.c.

◆ VLC_NUM_CODES

#define VLC_NUM_CODES   102

◆ OFFSET

#define OFFSET (   x)    offsetof(MPVEncContext, x)

Definition at line 1307 of file mpeg4videoenc.c.

◆ VE

Definition at line 1308 of file mpeg4videoenc.c.

Function Documentation

◆ mainctx_to_mpeg4()

static Mpeg4EncContext* mainctx_to_mpeg4 ( MPVMainEncContext m)
inlinestatic

Definition at line 81 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_picture_header().

◆ get_block_rate()

static int get_block_rate ( MPVEncContext *const  s,
int16_t  block[64],
int  block_last_index,
const uint8_t  scantable[64] 
)
inlinestatic

Return the number of bits that encoding the 8x8 block in block would need.

Parameters
[in]block_last_indexlast index in scantable order that refers to a non zero element in block.

Definition at line 90 of file mpeg4videoenc.c.

Referenced by decide_ac_pred().

◆ restore_ac_coeffs()

static void restore_ac_coeffs ( MPVEncContext *const  s,
int16_t  block[6][64],
const int  dir[6],
const uint8_t *  st[6],
const int  zigzag_last_index[6] 
)
inlinestatic

Restore the ac coefficients in block that have been changed by decide_ac_pred().

This function also restores s->c.block_last_index.

Parameters
[in,out]blockMB coefficients, these will be restored
[in]dirac prediction direction for each 8x8 block
[out]stscantable for each 8x8 block
[in]zigzag_last_indexindex referring to the last non zero coefficient in zigzag order

Definition at line 125 of file mpeg4videoenc.c.

Referenced by decide_ac_pred(), and mpeg4_encode_mb().

◆ decide_ac_pred()

static int decide_ac_pred ( MPVEncContext *const  s,
int16_t  block[6][64],
const int  dir[6],
const uint8_t *  st[6],
int  zigzag_last_index[6] 
)
inlinestatic

Return the optimal value (0 or 1) for the ac_pred element for the given MB in MPEG-4.

This function will also update s->c.block_last_index and s->c.ac_val.

Parameters
[in,out]blockMB coefficients, these will be updated if 1 is returned
[in]dirac prediction direction for each 8x8 block
[out]stscantable for each 8x8 block
[out]zigzag_last_indexindex referring to the last non zero coefficient in zigzag order

Definition at line 156 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_mb().

◆ ff_clean_mpeg4_qscales()

void ff_clean_mpeg4_qscales ( MPVEncContext *const  s)

modify mb_type & qscale so that encoding is actually possible in MPEG-4

Definition at line 239 of file mpeg4videoenc.c.

Referenced by estimate_qp().

◆ mpeg4_encode_dc()

static void mpeg4_encode_dc ( PutBitContext s,
int  level,
int  n 
)
inlinestatic

Encode the dc value.

Parameters
nblock index (0-3 are luma, 4-5 are chroma)

Definition at line 281 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_blocks_intra().

◆ mpeg4_encode_ac_coeffs()

static void mpeg4_encode_ac_coeffs ( const int16_t  block[64],
const int  last_index,
int  i,
const uint8_t *const  scan_table,
PutBitContext *const  ac_pb,
const uint32_t *const  bits_tab,
const uint8_t *const  len_tab 
)
inlinestatic

Encode the AC coefficients of an 8x8 block.

Definition at line 297 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_blocks_inter(), and mpeg4_encode_blocks_intra().

◆ mpeg4_encode_blocks_inter()

static void mpeg4_encode_blocks_inter ( MPVEncContext *const  s,
const int16_t  block[6][64],
PutBitContext ac_pb 
)
static

Definition at line 340 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_mb().

◆ mpeg4_encode_blocks_intra()

static void mpeg4_encode_blocks_intra ( MPVEncContext *const  s,
const int16_t  block[6][64],
const int  intra_dc[6],
const uint8_t *const *  scan_table,
PutBitContext dc_pb,
PutBitContext ac_pb 
)
static

Definition at line 356 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_mb().

◆ get_b_cbp()

static int get_b_cbp ( MPVEncContext *const  s,
int16_t  block[6][64],
int  motion_x,
int  motion_y,
int  mb_type 
)
inlinestatic

Definition at line 377 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_mb().

◆ mpeg4_encode_mb()

static void mpeg4_encode_mb ( MPVEncContext *const  s,
int16_t  block[][64],
int  motion_x,
int  motion_y 
)
static

Definition at line 421 of file mpeg4videoenc.c.

Referenced by encode_init().

◆ ff_mpeg4_stuffing()

void ff_mpeg4_stuffing ( PutBitContext pbc)

add MPEG-4 stuffing bits (01...1)

Definition at line 804 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_gop_header(), mpeg4_encode_visual_object_header(), mpeg4_encode_vol_header(), and write_slice_end().

◆ ff_set_mpeg4_time()

void ff_set_mpeg4_time ( MPVEncContext *const  s)

Definition at line 812 of file mpeg4videoenc.c.

Referenced by encode_picture().

◆ mpeg4_encode_gop_header()

static void mpeg4_encode_gop_header ( MPVMainEncContext *const  m)
static

Definition at line 822 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_picture_header().

◆ mpeg4_encode_visual_object_header()

static void mpeg4_encode_visual_object_header ( MPVMainEncContext *const  m)
static

Definition at line 852 of file mpeg4videoenc.c.

Referenced by encode_init(), and mpeg4_encode_picture_header().

◆ mpeg4_encode_vol_header()

static void mpeg4_encode_vol_header ( Mpeg4EncContext *const  m4,
int  vo_number,
int  vol_number 
)
static

Definition at line 895 of file mpeg4videoenc.c.

Referenced by encode_init(), and mpeg4_encode_picture_header().

◆ mpeg4_encode_picture_header()

static int mpeg4_encode_picture_header ( MPVMainEncContext *const  m)
static

Definition at line 986 of file mpeg4videoenc.c.

Referenced by encode_init().

◆ init_uni_dc_tab()

static av_cold void init_uni_dc_tab ( void  )
static

Definition at line 1048 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_init_static().

◆ init_uni_mpeg4_rl_tab()

static av_cold void init_uni_mpeg4_rl_tab ( RLTable rl,
uint32_t *  bits_tab,
uint8_t *  len_tab 
)
static

Definition at line 1103 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_init_static().

◆ mpeg4_encode_init_static()

static av_cold void mpeg4_encode_init_static ( void  )
static

Definition at line 1181 of file mpeg4videoenc.c.

Referenced by encode_init().

◆ encode_init()

static av_cold int encode_init ( AVCodecContext avctx)
static

Definition at line 1194 of file mpeg4videoenc.c.

◆ ff_mpeg4_init_partitions()

void ff_mpeg4_init_partitions ( MPVEncContext *const  s)

Definition at line 1256 of file mpeg4videoenc.c.

Referenced by encode_thread().

◆ ff_mpeg4_merge_partitions()

void ff_mpeg4_merge_partitions ( MPVEncContext *const  s)

Definition at line 1269 of file mpeg4videoenc.c.

Referenced by write_slice_end().

◆ ff_mpeg4_encode_video_packet_header()

void ff_mpeg4_encode_video_packet_header ( MPVEncContext *const  s)

Definition at line 1295 of file mpeg4videoenc.c.

Referenced by encode_thread().

Variable Documentation

◆ fcode_tab

uint8_t fcode_tab[MAX_MV *2+1]
static

Minimal fcode that a motion vector component would need.

Definition at line 44 of file mpeg4videoenc.c.

Referenced by encode_init(), ff_get_best_fcode(), and mpeg4_encode_init_static().

◆ uni_DCtab_lum_len

uint8_t uni_DCtab_lum_len[512]
static

Definition at line 49 of file mpeg4videoenc.c.

Referenced by encode_init(), init_uni_dc_tab(), and mpeg4_encode_dc().

◆ uni_DCtab_chrom_len

uint8_t uni_DCtab_chrom_len[512]
static

Definition at line 50 of file mpeg4videoenc.c.

Referenced by init_uni_dc_tab(), and mpeg4_encode_dc().

◆ uni_DCtab_lum_bits

uint16_t uni_DCtab_lum_bits[512]
static

Definition at line 51 of file mpeg4videoenc.c.

Referenced by init_uni_dc_tab(), and mpeg4_encode_dc().

◆ uni_DCtab_chrom_bits

uint16_t uni_DCtab_chrom_bits[512]
static

Definition at line 52 of file mpeg4videoenc.c.

Referenced by init_uni_dc_tab(), and mpeg4_encode_dc().

◆ uni_mpeg4_intra_rl_bits

uint32_t uni_mpeg4_intra_rl_bits[64 *64 *2 *2]
static

Definition at line 56 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_blocks_intra(), and mpeg4_encode_init_static().

◆ uni_mpeg4_intra_rl_len

uint8_t uni_mpeg4_intra_rl_len[64 *64 *2 *2]
static

◆ uni_mpeg4_inter_rl_bits

uint32_t uni_mpeg4_inter_rl_bits[64 *64 *2 *2]
static

Definition at line 58 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_blocks_inter(), and mpeg4_encode_init_static().

◆ uni_mpeg4_inter_rl_len

uint8_t uni_mpeg4_inter_rl_len[64 *64 *2 *2]
static

◆ dquant_code

const int dquant_code[5] = { 1, 0, 9, 2, 3 }
static

Definition at line 419 of file mpeg4videoenc.c.

Referenced by mpeg4_encode_mb().

◆ options

const AVOption options[]
static
Initial value:
= {
{ "data_partitioning", "Use data partitioning.", OFFSET(c.data_partitioning), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
{ "alternate_scan", "Enable alternate scantable.", OFFSET(c.alternate_scan), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
{ "mpeg_quant", "Use MPEG quantizers instead of H.263",
OFFSET(mpeg_quant), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, VE },
{ NULL },
}

Definition at line 1309 of file mpeg4videoenc.c.

◆ mpeg4enc_class

const AVClass mpeg4enc_class
static
Initial value:
= {
.class_name = "MPEG4 encoder",
.item_name = av_default_item_name,
.option = options,
}

Definition at line 1321 of file mpeg4videoenc.c.

◆ ff_mpeg4_encoder

const FFCodec ff_mpeg4_encoder
Initial value:

Definition at line 1328 of file mpeg4videoenc.c.

CODEC_PIXFMTS
#define CODEC_PIXFMTS(...)
Definition: codec_internal.h:386
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
AV_CODEC_ID_MPEG4
@ AV_CODEC_ID_MPEG4
Definition: codec_id.h:64
OFFSET
#define OFFSET(x)
Definition: mpeg4videoenc.c:1307
FF_MPV_COMMON_MOTION_EST_OPTS
#define FF_MPV_COMMON_MOTION_EST_OPTS
Definition: mpegvideoenc.h:356
ff_mpv_encode_picture
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic_arg, int *got_packet)
Definition: mpegvideo_enc.c:1929
FF_MPV_COMMON_OPTS
#define FF_MPV_COMMON_OPTS
Definition: mpegvideoenc.h:315
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:353
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:144
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
NULL
#define NULL
Definition: coverity.c:32
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:240
Mpeg4EncContext
Definition: mpeg4videoenc.c:75
ff_mpv_encode_end
av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
Definition: mpegvideo_enc.c:1107
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:99
FF_MPEG4_PROFILE_OPTS
#define FF_MPEG4_PROFILE_OPTS
Definition: profiles.h:42
VE
#define VE
Definition: mpeg4videoenc.c:1308
mpeg4enc_class
static const AVClass mpeg4enc_class
Definition: mpeg4videoenc.c:1321
options
static const AVOption options[]
Definition: mpeg4videoenc.c:1309
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:733
encode_init
static av_cold int encode_init(AVCodecContext *avctx)
Definition: mpeg4videoenc.c:1194
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:76
FF_MPV_COMMON_BFRAME_OPTS
#define FF_MPV_COMMON_BFRAME_OPTS
Definition: mpegvideoenc.h:351
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327