FFmpeg
Macros | Functions | Variables
huffyuvdec.c File Reference
#include "avcodec.h"
#include "get_bits.h"
#include "huffyuv.h"
#include "huffyuvdsp.h"
#include "lossless_videodsp.h"
#include "thread.h"
#include "libavutil/imgutils.h"
#include "libavutil/pixdesc.h"

Go to the source code of this file.

Macros

#define UNCHECKED_BITSTREAM_READER   1
 
#define classic_shift_luma_table_size   42
 
#define classic_shift_chroma_table_size   59
 
#define VLC_INTERN(dst, table, gb, name, bits, max_depth)
 Subset of GET_VLC for use in hand-roller VLC code. More...
 
#define GET_VLC_DUAL(dst0, dst1, name, gb, dtable, table1, table2, bits, max_depth, OP)
 
#define OP8bits(dst0, dst1, code)   dst0 = code>>8; dst1 = code
 
#define READ_2PIX(dst0, dst1, plane1)
 
#define READ_2PIX_PLANE(dst0, dst1, plane, OP)
 
#define OP14bits(dst0, dst1, code)   dst0 = code>>8; dst1 = sign_extend(code, 8)
 
#define READ_2PIX_PLANE16(dst0, dst1, plane)
 

Functions

static int read_len_table (uint8_t *dst, GetBitContext *gb, int n)
 
static int generate_joint_tables (HYuvContext *s)
 
static int read_huffman_tables (HYuvContext *s, const uint8_t *src, int length)
 
static int read_old_huffman_tables (HYuvContext *s)
 
static av_cold int decode_end (AVCodecContext *avctx)
 
static av_cold int decode_init (AVCodecContext *avctx)
 
static void decode_422_bitstream (HYuvContext *s, int count)
 
static void decode_plane_bitstream (HYuvContext *s, int width, int plane)
 
static void decode_gray_bitstream (HYuvContext *s, int count)
 
static av_always_inline void decode_bgr_1 (HYuvContext *s, int count, int decorrelate, int alpha)
 
static void decode_bgr_bitstream (HYuvContext *s, int count)
 
static void draw_slice (HYuvContext *s, AVFrame *frame, int y)
 
static int left_prediction (HYuvContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
 
static void add_bytes (HYuvContext *s, uint8_t *dst, uint8_t *src, int w)
 
static void add_median_prediction (HYuvContext *s, uint8_t *dst, const uint8_t *src, const uint8_t *diff, int w, int *left, int *left_top)
 
static int decode_slice (AVCodecContext *avctx, AVFrame *p, int height, int buf_size, int y_offset, int table_size)
 
static int decode_frame (AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
 

Variables

static const unsigned char classic_shift_luma [classic_shift_luma_table_size+AV_INPUT_BUFFER_PADDING_SIZE]
 
static const unsigned char classic_shift_chroma [classic_shift_chroma_table_size+AV_INPUT_BUFFER_PADDING_SIZE]
 
static const unsigned char classic_add_luma [256]
 
static const unsigned char classic_add_chroma [256]
 
AVCodec ff_huffyuv_decoder
 

Detailed Description

huffyuv decoder

Definition in file huffyuvdec.c.

Macro Definition Documentation

◆ UNCHECKED_BITSTREAM_READER

#define UNCHECKED_BITSTREAM_READER   1

Definition at line 33 of file huffyuvdec.c.

◆ classic_shift_luma_table_size

#define classic_shift_luma_table_size   42

Definition at line 44 of file huffyuvdec.c.

◆ classic_shift_chroma_table_size

#define classic_shift_chroma_table_size   59

Definition at line 52 of file huffyuvdec.c.

◆ VLC_INTERN

#define VLC_INTERN (   dst,
  table,
  gb,
  name,
  bits,
  max_depth 
)
Value:
code = table[index][0]; \
n = table[index][1]; \
if (max_depth > 1 && n < 0) { \
LAST_SKIP_BITS(name, gb, bits); \
UPDATE_CACHE(name, gb); \
\
nb_bits = -n; \
index = SHOW_UBITS(name, gb, nb_bits) + code; \
code = table[index][0]; \
n = table[index][1]; \
if (max_depth > 2 && n < 0) { \
LAST_SKIP_BITS(name, gb, nb_bits); \
UPDATE_CACHE(name, gb); \
\
nb_bits = -n; \
index = SHOW_UBITS(name, gb, nb_bits) + code; \
code = table[index][0]; \
n = table[index][1]; \
} \
} \
dst = code; \
LAST_SKIP_BITS(name, gb, n)

Subset of GET_VLC for use in hand-roller VLC code.

Definition at line 603 of file huffyuvdec.c.

◆ GET_VLC_DUAL

#define GET_VLC_DUAL (   dst0,
  dst1,
  name,
  gb,
  dtable,
  table1,
  table2,
  bits,
  max_depth,
  OP 
)
Value:
do { \
unsigned int index = SHOW_UBITS(name, gb, bits); \
int code, n = dtable[index][1]; \
if (n<=0) { \
int nb_bits; \
VLC_INTERN(dst0, table1, gb, name, bits, max_depth); \
index = SHOW_UBITS(name, gb, bits); \
VLC_INTERN(dst1, table2, gb, name, bits, max_depth); \
} else { \
code = dtable[index][0]; \
OP(dst0, dst1, code); \
LAST_SKIP_BITS(name, gb, n); \
} \
} while (0)

Definition at line 628 of file huffyuvdec.c.

◆ OP8bits

#define OP8bits (   dst0,
  dst1,
  code 
)    dst0 = code>>8; dst1 = code

Definition at line 648 of file huffyuvdec.c.

◆ READ_2PIX

#define READ_2PIX (   dst0,
  dst1,
  plane1 
)
Value:
UPDATE_CACHE(re, &s->gb); \
GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane1].table, \
s->vlc[0].table, s->vlc[plane1].table, VLC_BITS, 3, OP8bits)

Definition at line 650 of file huffyuvdec.c.

◆ READ_2PIX_PLANE

#define READ_2PIX_PLANE (   dst0,
  dst1,
  plane,
  OP 
)
Value:
UPDATE_CACHE(re, &s->gb); \
GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane].table, \
s->vlc[plane].table, s->vlc[plane].table, VLC_BITS, 3, OP)

Definition at line 684 of file huffyuvdec.c.

◆ OP14bits

#define OP14bits (   dst0,
  dst1,
  code 
)    dst0 = code>>8; dst1 = sign_extend(code, 8)

Definition at line 689 of file huffyuvdec.c.

◆ READ_2PIX_PLANE16

#define READ_2PIX_PLANE16 (   dst0,
  dst1,
  plane 
)
Value:
{\
dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;\
dst0 += get_bits(&s->gb, 2);\
dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;\
dst1 += get_bits(&s->gb, 2);\
}

Definition at line 693 of file huffyuvdec.c.

Function Documentation

◆ read_len_table()

static int read_len_table ( uint8_t dst,
GetBitContext gb,
int  n 
)
static

Definition at line 99 of file huffyuvdec.c.

Referenced by read_huffman_tables(), and read_old_huffman_tables().

◆ generate_joint_tables()

static int generate_joint_tables ( HYuvContext s)
static

Definition at line 118 of file huffyuvdec.c.

Referenced by read_huffman_tables(), and read_old_huffman_tables().

◆ read_huffman_tables()

static int read_huffman_tables ( HYuvContext s,
const uint8_t src,
int  length 
)
static

Definition at line 208 of file huffyuvdec.c.

Referenced by decode_frame(), and decode_init().

◆ read_old_huffman_tables()

static int read_old_huffman_tables ( HYuvContext s)
static

Definition at line 237 of file huffyuvdec.c.

Referenced by decode_init().

◆ decode_end()

static av_cold int decode_end ( AVCodecContext avctx)
static

Definition at line 277 of file huffyuvdec.c.

Referenced by decode_init().

◆ decode_init()

static av_cold int decode_init ( AVCodecContext avctx)
static

Definition at line 291 of file huffyuvdec.c.

◆ decode_422_bitstream()

static void decode_422_bitstream ( HYuvContext s,
int  count 
)
static

Definition at line 655 of file huffyuvdec.c.

Referenced by decode_slice().

◆ decode_plane_bitstream()

static void decode_plane_bitstream ( HYuvContext s,
int  width,
int  plane 
)
static

Definition at line 699 of file huffyuvdec.c.

Referenced by decode_slice().

◆ decode_gray_bitstream()

static void decode_gray_bitstream ( HYuvContext s,
int  count 
)
static

Definition at line 760 of file huffyuvdec.c.

Referenced by decode_slice().

◆ decode_bgr_1()

static av_always_inline void decode_bgr_1 ( HYuvContext s,
int  count,
int  decorrelate,
int  alpha 
)
static

Definition at line 778 of file huffyuvdec.c.

Referenced by decode_bgr_bitstream().

◆ decode_bgr_bitstream()

static void decode_bgr_bitstream ( HYuvContext s,
int  count 
)
static

Definition at line 836 of file huffyuvdec.c.

Referenced by decode_slice().

◆ draw_slice()

static void draw_slice ( HYuvContext s,
AVFrame frame,
int  y 
)
static

Definition at line 851 of file huffyuvdec.c.

Referenced by decode_slice().

◆ left_prediction()

static int left_prediction ( HYuvContext s,
uint8_t dst,
const uint8_t src,
int  w,
int  acc 
)
static

Definition at line 879 of file huffyuvdec.c.

Referenced by decode_slice().

◆ add_bytes()

static void add_bytes ( HYuvContext s,
uint8_t dst,
uint8_t src,
int  w 
)
static

Definition at line 888 of file huffyuvdec.c.

Referenced by decode_slice().

◆ add_median_prediction()

static void add_median_prediction ( HYuvContext s,
uint8_t dst,
const uint8_t src,
const uint8_t diff,
int  w,
int left,
int left_top 
)
static

Definition at line 897 of file huffyuvdec.c.

Referenced by decode_slice().

◆ decode_slice()

static int decode_slice ( AVCodecContext avctx,
AVFrame p,
int  height,
int  buf_size,
int  y_offset,
int  table_size 
)
static

Definition at line 906 of file huffyuvdec.c.

Referenced by decode_frame().

◆ decode_frame()

static int decode_frame ( AVCodecContext avctx,
void *  data,
int got_frame,
AVPacket avpkt 
)
static

Definition at line 1217 of file huffyuvdec.c.

Variable Documentation

◆ classic_shift_luma

const unsigned char classic_shift_luma[classic_shift_luma_table_size+AV_INPUT_BUFFER_PADDING_SIZE]
static
Initial value:
= {
34, 36, 35, 69, 135, 232, 9, 16, 10, 24, 11, 23, 12, 16, 13, 10,
14, 8, 15, 8, 16, 8, 17, 20, 16, 10, 207, 206, 205, 236, 11, 8,
10, 21, 9, 23, 8, 8, 199, 70, 69, 68, 0,
0,0,0,0,0,0,0,0,
}

Definition at line 45 of file huffyuvdec.c.

Referenced by read_old_huffman_tables().

◆ classic_shift_chroma

const unsigned char classic_shift_chroma[classic_shift_chroma_table_size+AV_INPUT_BUFFER_PADDING_SIZE]
static
Initial value:
= {
66, 36, 37, 38, 39, 40, 41, 75, 76, 77, 110, 239, 144, 81, 82, 83,
84, 85, 118, 183, 56, 57, 88, 89, 56, 89, 154, 57, 58, 57, 26, 141,
57, 56, 58, 57, 58, 57, 184, 119, 214, 245, 116, 83, 82, 49, 80, 79,
78, 77, 44, 75, 41, 40, 39, 38, 37, 36, 34, 0,
0,0,0,0,0,0,0,0,
}

Definition at line 53 of file huffyuvdec.c.

Referenced by read_old_huffman_tables().

◆ classic_add_luma

const unsigned char classic_add_luma[256]
static
Initial value:
= {
3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
}

Definition at line 61 of file huffyuvdec.c.

Referenced by read_old_huffman_tables().

◆ classic_add_chroma

const unsigned char classic_add_chroma[256]
static
Initial value:
= {
3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
43, 45, 76, 81, 46, 82, 75, 55, 56, 144, 58, 80, 60, 74, 147, 63,
143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
17, 14, 5, 6, 100, 54, 47, 50, 51, 53, 106, 107, 108, 109, 110, 111,
112, 113, 114, 115, 4, 117, 118, 92, 94, 121, 122, 3, 124, 103, 2, 1,
0, 129, 130, 131, 120, 119, 126, 125, 136, 137, 138, 139, 140, 141, 142, 134,
135, 132, 133, 104, 64, 101, 62, 57, 102, 95, 93, 59, 61, 28, 97, 96,
52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
7, 128, 127, 105, 123, 116, 35, 34, 33, 145, 31, 79, 42, 146, 78, 26,
83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
}

Definition at line 80 of file huffyuvdec.c.

Referenced by read_old_huffman_tables().

◆ ff_huffyuv_decoder

AVCodec ff_huffyuv_decoder
Initial value:
= {
.name = "huffyuv",
.long_name = NULL_IF_CONFIG_SMALL("Huffyuv / HuffYUV"),
.priv_data_size = sizeof(HYuvContext),
.close = decode_end,
.init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
}

Definition at line 1302 of file huffyuvdec.c.

HYuvContext
Definition: huffyuv.h:55
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
AV_CODEC_ID_HUFFYUV
@ AV_CODEC_ID_HUFFYUV
Definition: avcodec.h:243
n
int n
Definition: avisynth_c.h:760
name
const char * name
Definition: avisynth_c.h:867
table
static const uint16_t table[]
Definition: prosumer.c:206
get_vlc2
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:797
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: huffyuvdec.c:291
UPDATE_CACHE
#define UPDATE_CACHE(name, gb)
Definition: get_bits.h:178
OP8bits
#define OP8bits(dst0, dst1, code)
Definition: huffyuvdec.c:648
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
plane
int plane
Definition: avisynth_c.h:384
VLC_BITS
#define VLC_BITS
Definition: asvdec.c:37
OP
#define OP(LOAD, STORE)
Definition: hpeldsp_alpha.c:55
decode
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:42
s
#define s(width, name)
Definition: cbs_vp9.c:257
bits
uint8_t bits
Definition: vp3data.h:202
if
if(ret)
Definition: filter_design.txt:179
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: avcodec.h:1037
ONLY_IF_THREADS_ENABLED
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
Definition: internal.h:227
index
int index
Definition: gxfenc.c:89
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:981
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:188
init_thread_copy
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have add an init_thread_copy() which re-allocates them for other threads. Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little speed gain at this point but it should work. If there are inter-frame dependencies
decode_end
static av_cold int decode_end(AVCodecContext *avctx)
Definition: huffyuvdec.c:277
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
SHOW_UBITS
#define SHOW_UBITS(name, gb, num)
Definition: get_bits.h:211
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
decode_frame
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: huffyuvdec.c:1217
AV_CODEC_CAP_DRAW_HORIZ_BAND
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
Definition: avcodec.h:975
re
float re
Definition: fft.c:82