FFmpeg
Data Structures | Macros | Functions | Variables
huffyuvenc.c File Reference
#include "config_components.h"
#include "avcodec.h"
#include "bswapdsp.h"
#include "codec_internal.h"
#include "encode.h"
#include "huffyuv.h"
#include "huffman.h"
#include "huffyuvencdsp.h"
#include "lossless_videoencdsp.h"
#include "put_bits.h"
#include "libavutil/emms.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"

Go to the source code of this file.

Data Structures

struct  HYuvEncContext
 

Macros

#define STATS_OUT_SIZE   21*MAX_N*3 + 4
 
#define LOAD4
 
#define LOADEND   int y0 = s->temp[0][width-1];
 
#define LOADEND_14   int y0 = s->temp16[0][width-1] & mask;
 
#define LOADEND_16   int y0 = s->temp16[0][width-1];
 
#define STATEND   s->stats[plane][y0]++;
 
#define STATEND_16   s->stats[plane][y0>>2]++;
 
#define WRITEEND   put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);
 
#define WRITEEND_16
 
#define LOAD2
 
#define LOAD2_14
 
#define LOAD2_16
 
#define STAT2
 
#define STAT2_16
 
#define WRITE2
 
#define WRITE2_16
 
#define LOAD2
 
#define STAT2
 
#define WRITE2
 
#define LOAD_GBRA
 
#define STAT_BGRA
 
#define WRITE_GBRA
 
#define OFFSET(x)   offsetof(HYuvEncContext, x)
 
#define VE   AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 
#define COMMON_OPTIONS
 

Functions

static void diff_bytes (HYuvEncContext *s, uint8_t *dst, const uint8_t *src0, const uint8_t *src1, int w)
 
static int sub_left_prediction (HYuvEncContext *s, uint8_t *dst, const uint8_t *src, int w, int left)
 
static void sub_left_prediction_bgr32 (HYuvEncContext *s, uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue, int *alpha)
 
static void sub_left_prediction_rgb24 (HYuvEncContext *s, uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue)
 
static void sub_median_prediction (HYuvEncContext *s, uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w, int *left, int *left_top)
 
static int store_table (HYuvEncContext *s, const uint8_t *len, uint8_t *buf)
 
static int store_huffman_tables (HYuvEncContext *s, uint8_t *buf)
 
static av_cold int encode_init (AVCodecContext *avctx)
 
static int encode_422_bitstream (HYuvEncContext *s, int offset, int count)
 
static int encode_plane_bitstream (HYuvEncContext *s, int width, int plane)
 
static int encode_gray_bitstream (HYuvEncContext *s, int count)
 
static int encode_bgra_bitstream (HYuvEncContext *s, int count, int planes)
 
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 normal_options []
 
static const AVOption ff_options []
 
static const AVClass normal_class
 
static const AVClass ff_class
 
const FFCodec ff_huffyuv_encoder
 

Detailed Description

huffyuv encoder

Definition in file huffyuvenc.c.

Macro Definition Documentation

◆ STATS_OUT_SIZE

#define STATS_OUT_SIZE   21*MAX_N*3 + 4

◆ LOAD4

#define LOAD4
Value:
int y0 = y[2 * i];\
int y1 = y[2 * i + 1];\
int u0 = u[i];\
int v0 = v[i];

◆ LOADEND

#define LOADEND   int y0 = s->temp[0][width-1];

◆ LOADEND_14

#define LOADEND_14   int y0 = s->temp16[0][width-1] & mask;

◆ LOADEND_16

#define LOADEND_16   int y0 = s->temp16[0][width-1];

◆ STATEND

#define STATEND   s->stats[plane][y0]++;

◆ STATEND_16

#define STATEND_16   s->stats[plane][y0>>2]++;

◆ WRITEEND

#define WRITEEND   put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);

◆ WRITEEND_16

#define WRITEEND_16
Value:
put_bits(&s->pb, s->len[plane][y0>>2], s->bits[plane][y0>>2]);\
put_bits(&s->pb, 2, y0&3);

◆ LOAD2 [1/2]

#define LOAD2
Value:
int y0 = s->temp[0][2 * i];\
int y1 = s->temp[0][2 * i + 1];

◆ LOAD2_14

#define LOAD2_14
Value:
int y0 = s->temp16[0][2 * i] & mask;\
int y1 = s->temp16[0][2 * i + 1] & mask;

◆ LOAD2_16

#define LOAD2_16
Value:
int y0 = s->temp16[0][2 * i];\
int y1 = s->temp16[0][2 * i + 1];

◆ STAT2 [1/2]

#define STAT2
Value:
s->stats[plane][y0]++;\
s->stats[plane][y1]++;

◆ STAT2_16

#define STAT2_16
Value:
s->stats[plane][y0>>2]++;\
s->stats[plane][y1>>2]++;

◆ WRITE2 [1/2]

#define WRITE2
Value:
put_bits(&s->pb, s->len[plane][y0], s->bits[plane][y0]);\
put_bits(&s->pb, s->len[plane][y1], s->bits[plane][y1]);

◆ WRITE2_16

#define WRITE2_16
Value:
put_bits(&s->pb, s->len[plane][y0>>2], s->bits[plane][y0>>2]);\
put_bits(&s->pb, 2, y0&3);\
put_bits(&s->pb, s->len[plane][y1>>2], s->bits[plane][y1>>2]);\
put_bits(&s->pb, 2, y1&3);

◆ LOAD2 [2/2]

#define LOAD2
Value:
int y0 = s->temp[0][2 * i];\
int y1 = s->temp[0][2 * i + 1];

◆ STAT2 [2/2]

#define STAT2
Value:
s->stats[0][y0]++;\
s->stats[0][y1]++;

◆ WRITE2 [2/2]

#define WRITE2
Value:
put_bits(&s->pb, s->len[0][y0], s->bits[0][y0]);\
put_bits(&s->pb, s->len[0][y1], s->bits[0][y1]);

◆ LOAD_GBRA

#define LOAD_GBRA
Value:
int g = s->temp[0][planes == 3 ? 3 * i + 1 : 4 * i + G]; \
int b =(s->temp[0][planes == 3 ? 3 * i + 2 : 4 * i + B] - g) & 0xFF;\
int r =(s->temp[0][planes == 3 ? 3 * i + 0 : 4 * i + R] - g) & 0xFF;\
int a = s->temp[0][planes * i + A];

◆ STAT_BGRA

#define STAT_BGRA
Value:
s->stats[0][b]++; \
s->stats[1][g]++; \
s->stats[2][r]++; \
if (planes == 4) \
s->stats[2][a]++;

◆ WRITE_GBRA

#define WRITE_GBRA
Value:
put_bits(&s->pb, s->len[1][g], s->bits[1][g]); \
put_bits(&s->pb, s->len[0][b], s->bits[0][b]); \
put_bits(&s->pb, s->len[2][r], s->bits[2][r]); \
if (planes == 4) \
put_bits(&s->pb, s->len[2][a], s->bits[2][a]);

◆ OFFSET

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

Definition at line 1044 of file huffyuvenc.c.

◆ VE

Definition at line 1045 of file huffyuvenc.c.

◆ COMMON_OPTIONS

#define COMMON_OPTIONS
Value:
{ "non_deterministic", "Allow multithreading for e.g. context=1 at the expense of determinism", \
OFFSET(non_determ), AV_OPT_TYPE_BOOL, { .i64 = 0 }, \
0, 1, VE }, \
{ "pred", "Prediction method", OFFSET(predictor), AV_OPT_TYPE_INT, { .i64 = LEFT }, LEFT, MEDIAN, VE, .unit = "pred" }, \
{ "left", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LEFT }, INT_MIN, INT_MAX, VE, .unit = "pred" }, \
{ "plane", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = PLANE }, INT_MIN, INT_MAX, VE, .unit = "pred" }, \
{ "median", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MEDIAN }, INT_MIN, INT_MAX, VE, .unit = "pred" }, \

Definition at line 1047 of file huffyuvenc.c.

Function Documentation

◆ diff_bytes()

static void diff_bytes ( HYuvEncContext s,
uint8_t *  dst,
const uint8_t *  src0,
const uint8_t *  src1,
int  w 
)
inlinestatic

Definition at line 78 of file huffyuvenc.c.

Referenced by encode_frame().

◆ sub_left_prediction()

static int sub_left_prediction ( HYuvEncContext s,
uint8_t *  dst,
const uint8_t *  src,
int  w,
int  left 
)
inlinestatic

Definition at line 88 of file huffyuvenc.c.

Referenced by encode_frame().

◆ sub_left_prediction_bgr32()

static void sub_left_prediction_bgr32 ( HYuvEncContext s,
uint8_t *  dst,
const uint8_t *  src,
int  w,
int red,
int green,
int blue,
int alpha 
)
inlinestatic

Definition at line 119 of file huffyuvenc.c.

Referenced by encode_frame().

◆ sub_left_prediction_rgb24()

static void sub_left_prediction_rgb24 ( HYuvEncContext s,
uint8_t *  dst,
const uint8_t *  src,
int  w,
int red,
int green,
int blue 
)
inlinestatic

Definition at line 155 of file huffyuvenc.c.

Referenced by encode_frame().

◆ sub_median_prediction()

static void sub_median_prediction ( HYuvEncContext s,
uint8_t *  dst,
const uint8_t *  src1,
const uint8_t *  src2,
int  w,
int left,
int left_top 
)
static

Definition at line 183 of file huffyuvenc.c.

Referenced by encode_frame().

◆ store_table()

static int store_table ( HYuvEncContext s,
const uint8_t *  len,
uint8_t *  buf 
)
static

Definition at line 194 of file huffyuvenc.c.

Referenced by store_huffman_tables().

◆ store_huffman_tables()

static int store_huffman_tables ( HYuvEncContext s,
uint8_t *  buf 
)
static

Definition at line 219 of file huffyuvenc.c.

Referenced by encode_frame(), and encode_init().

◆ encode_init()

static av_cold int encode_init ( AVCodecContext avctx)
static

Definition at line 241 of file huffyuvenc.c.

◆ encode_422_bitstream()

static int encode_422_bitstream ( HYuvEncContext s,
int  offset,
int  count 
)
static

Definition at line 440 of file huffyuvenc.c.

Referenced by encode_frame().

◆ encode_plane_bitstream()

static int encode_plane_bitstream ( HYuvEncContext s,
int  width,
int  plane 
)
static

Definition at line 495 of file huffyuvenc.c.

Referenced by encode_frame().

◆ encode_gray_bitstream()

static int encode_gray_bitstream ( HYuvEncContext s,
int  count 
)
static

Definition at line 657 of file huffyuvenc.c.

Referenced by encode_frame().

◆ encode_bgra_bitstream()

static int encode_bgra_bitstream ( HYuvEncContext s,
int  count,
int  planes 
)
inlinestatic

Definition at line 702 of file huffyuvenc.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 752 of file huffyuvenc.c.

◆ encode_end()

static av_cold int encode_end ( AVCodecContext avctx)
static

Definition at line 1033 of file huffyuvenc.c.

Variable Documentation

◆ normal_options

const AVOption normal_options[]
static
Initial value:
= {
{ NULL },
}

Definition at line 1056 of file huffyuvenc.c.

◆ ff_options

const AVOption ff_options[]
static
Initial value:
= {
{ "context", "Set per-frame huffman tables", OFFSET(context), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
{ NULL },
}

Definition at line 1061 of file huffyuvenc.c.

◆ normal_class

const AVClass normal_class
static
Initial value:
= {
.class_name = "huffyuv",
.item_name = av_default_item_name,
.option = normal_options,
}

Definition at line 1067 of file huffyuvenc.c.

◆ ff_class

const AVClass ff_class
static
Initial value:
= {
.class_name = "ffvhuff",
.item_name = av_default_item_name,
.option = ff_options,
}

Definition at line 1074 of file huffyuvenc.c.

◆ ff_huffyuv_encoder

const FFCodec ff_huffyuv_encoder
Initial value:
= {
.p.name = "huffyuv",
CODEC_LONG_NAME("Huffyuv / HuffYUV"),
.p.type = AVMEDIA_TYPE_VIDEO,
.priv_data_size = sizeof(HYuvEncContext),
.close = encode_end,
.p.priv_class = &normal_class,
.p.pix_fmts = (const enum AVPixelFormat[]){
},
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
}

Definition at line 1081 of file huffyuvenc.c.

A
#define A(x)
Definition: vpx_arith.h:28
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
planes
static const struct @385 planes[]
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
r
const char * r
Definition: vf_curves.c:126
AV_CODEC_ID_HUFFYUV
@ AV_CODEC_ID_HUFFYUV
Definition: codec_id.h:77
u
#define u(width, name, range_min, range_max)
Definition: cbs_h2645.c:250
OFFSET
#define OFFSET(x)
Definition: huffyuvenc.c:1044
encode_init
static av_cold int encode_init(AVCodecContext *avctx)
Definition: huffyuvenc.c:241
put_bits
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:222
b
#define b
Definition: input.c:41
R
#define R
Definition: huffyuv.h:44
MEDIAN
@ MEDIAN
Definition: huffyuv.h:55
v0
#define v0
Definition: regdef.h:26
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:296
mask
static const uint16_t mask[17]
Definition: lzw.c:38
s
#define s(width, name)
Definition: cbs_vp9.c:198
g
const char * g
Definition: vf_curves.c:127
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
B
#define B
Definition: huffyuv.h:42
normal_class
static const AVClass normal_class
Definition: huffyuvenc.c:1067
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:272
context
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your context
Definition: writing_filters.txt:91
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:110
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:237
encode_end
static av_cold int encode_end(AVCodecContext *avctx)
Definition: huffyuvenc.c:1033
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:365
AV_PIX_FMT_RGB24
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
Definition: pixfmt.h:75
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
HYuvEncContext
Definition: huffyuvenc.c:46
LEFT
#define LEFT
Definition: cdgraphics.c:171
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:451
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
predictor
static void predictor(uint8_t *src, ptrdiff_t size)
Definition: exrenc.c:170
COMMON_OPTIONS
#define COMMON_OPTIONS
Definition: huffyuvenc.c:1047
VE
#define VE
Definition: huffyuvenc.c:1045
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
normal_options
static const AVOption normal_options[]
Definition: huffyuvenc.c:1056
PLANE
@ PLANE
Definition: huffyuv.h:54
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:235
ff_options
static const AVOption ff_options[]
Definition: huffyuvenc.c:1061
G
#define G
Definition: huffyuv.h:43
encode_frame
static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pict, int *got_packet)
Definition: huffyuvenc.c:752
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:251
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:244