FFmpeg
Data Structures | Macros | Functions | Variables
snowenc.c File Reference
#include "libavutil/emms.h"
#include "libavutil/intmath.h"
#include "libavutil/libm.h"
#include "libavutil/log.h"
#include "libavutil/mem.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "codec_internal.h"
#include "encode.h"
#include "internal.h"
#include "me_cmp.h"
#include "packet_internal.h"
#include "qpeldsp.h"
#include "snow_dwt.h"
#include "snow.h"
#include "rangecoder.h"
#include "mathops.h"
#include "mpegvideo.h"
#include "h263enc.h"

Go to the source code of this file.

Data Structures

struct  SnowEncContext
 

Macros

#define FF_ME_ITER   3
 
#define ME_CACHE_SIZE   1024
 
#define mcf(dx, dy)
 
#define P_LEFT   P[1]
 
#define P_TOP   P[2]
 
#define P_TOPRIGHT   P[3]
 
#define P_MEDIAN   P[4]
 
#define P_MV1   P[9]
 
#define FLAG_QPEL   1
 
#define OFFSET(x)   offsetof(SnowEncContext, x)
 
#define VE   AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 

Functions

static void init_ref (MotionEstContext *c, const uint8_t *const src[3], uint8_t *const ref[3], uint8_t *const ref2[3], int x, int y, int ref_index)
 
static void put_symbol (RangeCoder *c, uint8_t *state, int v, int is_signed)
 
static void put_symbol2 (RangeCoder *c, uint8_t *state, int v, int log2)
 
static int get_encode_buffer (SnowContext *s, AVFrame *frame)
 
static av_cold int encode_init (AVCodecContext *avctx)
 
static int pix_sum (const uint8_t *pix, int line_size, int w, int h)
 
static int pix_norm1 (const uint8_t *pix, int line_size, int w)
 
static int get_penalty_factor (int lambda, int lambda2, int type)
 
static int encode_q_branch (SnowEncContext *enc, int level, int x, int y)
 
static void encode_q_branch2 (SnowContext *s, int level, int x, int y)
 
static int get_dc (SnowEncContext *enc, int mb_x, int mb_y, int plane_index)
 
static int get_block_bits (SnowContext *s, int x, int y, int w)
 
static int get_block_rd (SnowEncContext *enc, int mb_x, int mb_y, int plane_index, uint8_t(*obmc_edged)[MB_SIZE *2])
 
static int get_4block_rd (SnowEncContext *enc, int mb_x, int mb_y, int plane_index)
 
static int encode_subband_c0run (SnowContext *s, SubBand *b, const IDWTELEM *src, const IDWTELEM *parent, int stride, int orientation)
 
static int encode_subband (SnowContext *s, SubBand *b, const IDWTELEM *src, const IDWTELEM *parent, int stride, int orientation)
 
static av_always_inline int check_block_intra (SnowEncContext *enc, int mb_x, int mb_y, int p[3], uint8_t(*obmc_edged)[MB_SIZE *2], int *best_rd)
 
static av_always_inline int check_block_inter (SnowEncContext *enc, int mb_x, int mb_y, int p0, int p1, uint8_t(*obmc_edged)[MB_SIZE *2], int *best_rd)
 
static av_always_inline int check_4block_inter (SnowEncContext *enc, int mb_x, int mb_y, int p0, int p1, int ref, int *best_rd)
 
static void iterative_me (SnowEncContext *enc)
 
static void encode_blocks (SnowEncContext *enc, int search)
 
static void quantize (SnowContext *s, SubBand *b, IDWTELEM *dst, DWTELEM *src, int stride, int bias)
 
static void dequantize (SnowContext *s, SubBand *b, IDWTELEM *src, int stride)
 
static void decorrelate (SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median)
 
static void correlate (SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median)
 
static void encode_qlogs (SnowContext *s)
 
static void encode_header (SnowContext *s)
 
static void update_last_header_values (SnowContext *s)
 
static int qscale2qlog (int qscale)
 
static int ratecontrol_1pass (SnowEncContext *enc, AVFrame *pict)
 
static void calculate_visual_weight (SnowContext *s, Plane *p)
 
static int encode_frame (AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
 
static av_cold int encode_end (AVCodecContext *avctx)
 

Variables

static const AVOption options []
 
static const AVClass snowenc_class
 
const FFCodec ff_snow_encoder
 

Macro Definition Documentation

◆ FF_ME_ITER

#define FF_ME_ITER   3

Definition at line 44 of file snowenc.c.

◆ ME_CACHE_SIZE

#define ME_CACHE_SIZE   1024

Definition at line 66 of file snowenc.c.

◆ mcf

#define mcf (   dx,
  dy 
)
Value:
enc->qdsp.put_qpel_pixels_tab [0][dy+dx/4]=\
enc->qdsp.put_no_rnd_qpel_pixels_tab[0][dy+dx/4]=\
s->h264qpel.put_h264_qpel_pixels_tab[0][dy+dx/4];\
enc->qdsp.put_qpel_pixels_tab [1][dy+dx/4]=\
enc->qdsp.put_no_rnd_qpel_pixels_tab[1][dy+dx/4]=\
s->h264qpel.put_h264_qpel_pixels_tab[1][dy+dx/4];

◆ P_LEFT

#define P_LEFT   P[1]

Definition at line 362 of file snowenc.c.

◆ P_TOP

#define P_TOP   P[2]

Definition at line 363 of file snowenc.c.

◆ P_TOPRIGHT

#define P_TOPRIGHT   P[3]

Definition at line 364 of file snowenc.c.

◆ P_MEDIAN

#define P_MEDIAN   P[4]

Definition at line 365 of file snowenc.c.

◆ P_MV1

#define P_MV1   P[9]

Definition at line 366 of file snowenc.c.

◆ FLAG_QPEL

#define FLAG_QPEL   1

Definition at line 367 of file snowenc.c.

◆ OFFSET

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

Definition at line 2101 of file snowenc.c.

◆ VE

Definition at line 2102 of file snowenc.c.

Function Documentation

◆ init_ref()

static void init_ref ( MotionEstContext c,
const uint8_t *const  src[3],
uint8_t *const  ref[3],
uint8_t *const  ref2[3],
int  x,
int  y,
int  ref_index 
)
static

Definition at line 73 of file snowenc.c.

Referenced by encode_q_branch().

◆ put_symbol()

static void put_symbol ( RangeCoder c,
uint8_t *  state,
int  v,
int  is_signed 
)
inlinestatic

Definition at line 90 of file snowenc.c.

Referenced by encode_header(), encode_q_branch(), encode_q_branch2(), and encode_qlogs().

◆ put_symbol2()

static void put_symbol2 ( RangeCoder c,
uint8_t *  state,
int  v,
int  log2 
)
inlinestatic

Definition at line 118 of file snowenc.c.

Referenced by encode_subband_c0run().

◆ get_encode_buffer()

static int get_encode_buffer ( SnowContext s,
AVFrame frame 
)
static

Definition at line 137 of file snowenc.c.

Referenced by encode_frame(), and encode_init().

◆ encode_init()

static av_cold int encode_init ( AVCodecContext avctx)
static

Definition at line 159 of file snowenc.c.

◆ pix_sum()

static int pix_sum ( const uint8_t *  pix,
int  line_size,
int  w,
int  h 
)
static

Definition at line 305 of file snowenc.c.

Referenced by encode_q_branch().

◆ pix_norm1()

static int pix_norm1 ( const uint8_t *  pix,
int  line_size,
int  w 
)
static

Definition at line 321 of file snowenc.c.

Referenced by encode_q_branch().

◆ get_penalty_factor()

static int get_penalty_factor ( int  lambda,
int  lambda2,
int  type 
)
inlinestatic

Definition at line 337 of file snowenc.c.

Referenced by encode_q_branch(), get_4block_rd(), and get_block_rd().

◆ encode_q_branch()

static int encode_q_branch ( SnowEncContext enc,
int  level,
int  x,
int  y 
)
static

Definition at line 369 of file snowenc.c.

Referenced by encode_blocks(), and iterative_me().

◆ encode_q_branch2()

static void encode_q_branch2 ( SnowContext s,
int  level,
int  x,
int  y 
)
static

Definition at line 605 of file snowenc.c.

Referenced by encode_blocks().

◆ get_dc()

static int get_dc ( SnowEncContext enc,
int  mb_x,
int  mb_y,
int  plane_index 
)
static

Definition at line 661 of file snowenc.c.

Referenced by iterative_me().

◆ get_block_bits()

static int get_block_bits ( SnowContext s,
int  x,
int  y,
int  w 
)
inlinestatic

Definition at line 721 of file snowenc.c.

Referenced by get_4block_rd(), and get_block_rd().

◆ get_block_rd()

static int get_block_rd ( SnowEncContext enc,
int  mb_x,
int  mb_y,
int  plane_index,
uint8_t(*)  obmc_edged[MB_SIZE *2] 
)
static

Definition at line 759 of file snowenc.c.

Referenced by check_block_inter(), and check_block_intra().

◆ get_4block_rd()

static int get_4block_rd ( SnowEncContext enc,
int  mb_x,
int  mb_y,
int  plane_index 
)
static

Definition at line 863 of file snowenc.c.

Referenced by check_4block_inter(), and iterative_me().

◆ encode_subband_c0run()

static int encode_subband_c0run ( SnowContext s,
SubBand b,
const IDWTELEM src,
const IDWTELEM parent,
int  stride,
int  orientation 
)
static

Definition at line 934 of file snowenc.c.

Referenced by encode_subband().

◆ encode_subband()

static int encode_subband ( SnowContext s,
SubBand b,
const IDWTELEM src,
const IDWTELEM parent,
int  stride,
int  orientation 
)
static

Definition at line 1054 of file snowenc.c.

Referenced by encode_frame().

◆ check_block_intra()

static av_always_inline int check_block_intra ( SnowEncContext enc,
int  mb_x,
int  mb_y,
int  p[3],
uint8_t(*)  obmc_edged[MB_SIZE *2],
int *  best_rd 
)
static

Definition at line 1061 of file snowenc.c.

Referenced by iterative_me().

◆ check_block_inter()

static av_always_inline int check_block_inter ( SnowEncContext enc,
int  mb_x,
int  mb_y,
int  p0,
int  p1,
uint8_t(*)  obmc_edged[MB_SIZE *2],
int *  best_rd 
)
static

Definition at line 1092 of file snowenc.c.

Referenced by iterative_me().

◆ check_4block_inter()

static av_always_inline int check_4block_inter ( SnowEncContext enc,
int  mb_x,
int  mb_y,
int  p0,
int  p1,
int  ref,
int *  best_rd 
)
static

Definition at line 1128 of file snowenc.c.

Referenced by iterative_me().

◆ iterative_me()

static void iterative_me ( SnowEncContext enc)
static

Definition at line 1177 of file snowenc.c.

Referenced by encode_blocks().

◆ encode_blocks()

static void encode_blocks ( SnowEncContext enc,
int  search 
)
static

Definition at line 1406 of file snowenc.c.

Referenced by encode_frame().

◆ quantize()

static void quantize ( SnowContext s,
SubBand b,
IDWTELEM dst,
DWTELEM src,
int  stride,
int  bias 
)
static

Definition at line 1430 of file snowenc.c.

Referenced by encode_frame().

◆ dequantize()

static void dequantize ( SnowContext s,
SubBand b,
IDWTELEM src,
int  stride 
)
static

Definition at line 1491 of file snowenc.c.

Referenced by encode_frame().

◆ decorrelate()

static void decorrelate ( SnowContext s,
SubBand b,
IDWTELEM src,
int  stride,
int  inverse,
int  use_median 
)
static

◆ correlate()

static void correlate ( SnowContext s,
SubBand b,
IDWTELEM src,
int  stride,
int  inverse,
int  use_median 
)
static

Definition at line 1537 of file snowenc.c.

Referenced by encode_frame().

◆ encode_qlogs()

static void encode_qlogs ( SnowContext s)
static

Definition at line 1561 of file snowenc.c.

Referenced by encode_header().

◆ encode_header()

static void encode_header ( SnowContext s)
static

Definition at line 1574 of file snowenc.c.

Referenced by encode_frame().

◆ update_last_header_values()

static void update_last_header_values ( SnowContext s)
static

Definition at line 1647 of file snowenc.c.

Referenced by encode_frame().

◆ qscale2qlog()

static int qscale2qlog ( int  qscale)
static

< 64 > 60

Definition at line 1667 of file snowenc.c.

Referenced by encode_frame(), and ratecontrol_1pass().

◆ ratecontrol_1pass()

static int ratecontrol_1pass ( SnowEncContext enc,
AVFrame pict 
)
static

Definition at line 1672 of file snowenc.c.

Referenced by encode_frame().

◆ calculate_visual_weight()

static void calculate_visual_weight ( SnowContext s,
Plane p 
)
static

Definition at line 1725 of file snowenc.c.

Referenced by encode_frame().

◆ encode_frame()

static int encode_frame ( AVCodecContext avctx,
AVPacket pkt,
const AVFrame pict,
int *  got_packet 
)
static

Definition at line 1755 of file snowenc.c.

◆ encode_end()

static av_cold int encode_end ( AVCodecContext avctx)
static

Definition at line 2077 of file snowenc.c.

Variable Documentation

◆ options

const AVOption options[]
static
Initial value:
= {
{"motion_est", "motion estimation algorithm", OFFSET(motion_est), AV_OPT_TYPE_INT, {.i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_ITER, VE, .unit = "motion_est" },
{ "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, VE, .unit = "motion_est" },
{ "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, VE, .unit = "motion_est" },
{ "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, VE, .unit = "motion_est" },
{ "iter", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ITER }, 0, 0, VE, .unit = "motion_est" },
{ "memc_only", "Only do ME/MC (I frames -> ref, P frame -> ME+MC).", OFFSET(memc_only), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
{ "no_bitstream", "Skip final bitstream writeout.", OFFSET(no_bitstream), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
{ "intra_penalty", "Penalty for intra blocks in block decission", OFFSET(intra_penalty), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
{ "iterative_dia_size", "Dia size for the iterative ME", OFFSET(iterative_dia_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
{ "sc_threshold", "Scene change threshold", OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, VE },
{ "pred", "Spatial decomposition type", OFFSET(pred), AV_OPT_TYPE_INT, { .i64 = 0 }, DWT_97, DWT_53, VE, .unit = "pred" },
{ "dwt97", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, INT_MIN, INT_MAX, VE, .unit = "pred" },
{ "dwt53", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, INT_MIN, INT_MAX, VE, .unit = "pred" },
{ "rc_eq", "Set rate control equation. When computing the expression, besides the standard functions "
"defined in the section 'Expression Evaluation', the following functions are available: "
"bits2qp(bits), qp2bits(qp). Also the following constants are available: iTex pTex tex mv "
"fCode iCount mcVar var isI isP isB avgQP qComp avgIITex avgPITex avgPPTex avgBPTex avgTex.",
OFFSET(m.rc_eq), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VE },
{ NULL },
}

Definition at line 2103 of file snowenc.c.

◆ snowenc_class

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

Definition at line 2125 of file snowenc.c.

◆ ff_snow_encoder

const FFCodec ff_snow_encoder
Initial value:

Definition at line 2132 of file snowenc.c.

AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
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:43
FF_ME_EPZS
#define FF_ME_EPZS
Definition: motion_est.h:42
encode_end
static av_cold int encode_end(AVCodecContext *avctx)
Definition: snowenc.c:2077
AV_CODEC_CAP_ENCODER_RECON_FRAME
#define AV_CODEC_CAP_ENCODER_RECON_FRAME
The encoder is able to output reconstructed frame data, i.e.
Definition: codec.h:174
DWT_97
#define DWT_97
Definition: snow_dwt.h:70
DWT_53
#define DWT_53
Definition: snow_dwt.h:71
encode_frame
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
Definition: snowenc.c:1755
OFFSET
#define OFFSET(x)
Definition: snowenc.c:2101
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:320
SnowEncContext
Definition: snowenc.c:46
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:159
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:296
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
NULL
#define NULL
Definition: coverity.c:32
VE
#define VE
Definition: snowenc.c:2102
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
FF_ME_XONE
#define FF_ME_XONE
Definition: motion_est.h:43
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
FF_ME_ITER
#define FF_ME_ITER
Definition: snowenc.c:44
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:700
pred
static const float pred[4]
Definition: siprdata.h:259
encode_init
static av_cold int encode_init(AVCodecContext *avctx)
Definition: snowenc.c:159
options
static const AVOption options[]
Definition: snowenc.c:2103
AV_CODEC_ID_SNOW
@ AV_CODEC_ID_SNOW
Definition: codec_id.h:267
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
snowenc_class
static const AVClass snowenc_class
Definition: snowenc.c:2125
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
Definition: opt.h:276
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
FF_ME_ZERO
#define FF_ME_ZERO
Definition: motion_est.h:41