Go to the documentation of this file.
39 #define CLV_VLC_BITS 9
85 int idx = 1, last = 0,
val,
skip;
87 memset(
blk, 0,
sizeof(*
blk) * 64);
93 while (idx < 64 && !last) {
110 val = ac_quant * (2 * aval + 1);
122 return (idx <= 64 && last) ? 0 : -1;
125 #define DCT_TEMPLATE(blk, step, bias, shift, dshift, OP) \
126 const int t0 = OP(2841 * blk[1 * step] + 565 * blk[7 * step]); \
127 const int t1 = OP( 565 * blk[1 * step] - 2841 * blk[7 * step]); \
128 const int t2 = OP(1609 * blk[5 * step] + 2408 * blk[3 * step]); \
129 const int t3 = OP(2408 * blk[5 * step] - 1609 * blk[3 * step]); \
130 const int t4 = OP(1108 * blk[2 * step] - 2676 * blk[6 * step]); \
131 const int t5 = OP(2676 * blk[2 * step] + 1108 * blk[6 * step]); \
132 const int t6 = ((blk[0 * step] + blk[4 * step]) * (1 << dshift)) + bias; \
133 const int t7 = ((blk[0 * step] - blk[4 * step]) * (1 << dshift)) + bias; \
134 const int t8 = t0 + t2; \
135 const int t9 = t0 - t2; \
136 const int tA = (int)(181U * (t9 + (t1 - t3)) + 0x80) >> 8; \
137 const int tB = (int)(181U * (t9 - (t1 - t3)) + 0x80) >> 8; \
138 const int tC = t1 + t3; \
140 blk[0 * step] = (t6 + t5 + t8) >> shift; \
141 blk[1 * step] = (t7 + t4 + tA) >> shift; \
142 blk[2 * step] = (t7 - t4 + tB) >> shift; \
143 blk[3 * step] = (t6 - t5 + tC) >> shift; \
144 blk[4 * step] = (t6 - t5 - tC) >> shift; \
145 blk[5 * step] = (t7 - t4 - tB) >> shift; \
146 blk[6 * step] = (t7 + t4 - tA) >> shift; \
147 blk[7 * step] = (t6 + t5 - t8) >> shift; \
150 #define COP(x) (((x) + 4) >> 3)
158 for (
i = 0;
i < 8;
i++) {
164 for (
i = 0;
i < 8;
i++) {
172 int i, has_ac[6], off;
174 for (
i = 0;
i < 6;
i++)
177 off = x * 16 + y * 16 *
c->pic->linesize[0];
178 for (
i = 0;
i < 4;
i++) {
181 if (!x && !(
i & 1)) {
182 c->block[0] +=
c->top_dc[0];
183 c->top_dc[0] =
c->block[0];
185 c->block[0] +=
c->left_dc[(
i & 2) >> 1];
187 c->left_dc[(
i & 2) >> 1] =
c->block[0];
188 c->block[0] *=
c->luma_dc_quant;
191 off +=
c->pic->linesize[0] * 8;
192 c->idsp.put_pixels_clamped(
c->block,
193 c->pic->data[0] + off + (
i & 1) * 8,
194 c->pic->linesize[0]);
197 off = x * 8 + y * 8 *
c->pic->linesize[1];
198 for (
i = 1;
i < 3;
i++) {
202 c->block[0] +=
c->top_dc[
i];
203 c->top_dc[
i] =
c->block[0];
205 c->block[0] +=
c->left_dc[
i + 1];
207 c->left_dc[
i + 1] =
c->block[0];
208 c->block[0] *=
c->chroma_dc_quant;
210 c->idsp.put_pixels_clamped(
c->block,
c->pic->data[
i] + off,
211 c->pic->linesize[
i]);
218 int plane,
int x,
int y,
int dx,
int dy,
int size)
220 int shift = plane > 0;
223 int sstride, dstride, soff, doff;
228 if (x < 0 || sx < 0 || y < 0 || sy < 0 ||
235 sstride =
src->linesize[plane];
237 soff = sx + sy * sstride;
238 sbuf =
src->data[plane];
239 doff = x + y * dstride;
240 dbuf = dst->
data[plane];
243 uint8_t *dptr = &dbuf[doff];
244 const uint8_t *sptr = &sbuf[soff];
246 memcpy(dptr, sptr,
size);
255 int plane,
int x,
int y,
int dx,
int dy,
int size,
int bias)
257 int shift = plane > 0;
260 int sstride =
src->linesize[plane];
262 int soff = sx + sy * sstride;
263 const uint8_t *sbuf =
src->data[plane];
264 int doff = x + y * dstride;
265 uint8_t *dbuf = dst->
data[plane];
268 if (x < 0 || sx < 0 || y < 0 || sy < 0 ||
275 for (j = 0; j <
size; j++) {
276 uint8_t *dptr = &dbuf[doff];
277 const uint8_t *sptr = &sbuf[soff];
295 int left_mv, right_mv, top_mv, bot_mv;
303 }
else if ((mb_x == 0) || (mb_x == mvi->
mb_w - 1)) {
307 MV B = mvi->
mv[ mb_x ];
308 MV C = mvi->
mv[ mb_x + 1];
315 left_mv = -((mb_x * mvi->
mb_size));
316 right_mv = ((mvi->
mb_w - mb_x - 1) * mvi->
mb_size);
317 if (res.
x < left_mv) {
320 if (res.
x > right_mv) {
323 top_mv = -((mb_y * mvi->
mb_size));
325 if (res.
y < top_mv) {
328 if (res.
y > bot_mv) {
365 int plane,
int x,
int y,
int dx,
int dy,
int size,
int bias)
381 int plane,
int x,
int y,
int size,
396 mv.x = (int8_t)(mv_code & 0xff);
397 mv.y = (int8_t)(mv_code >> 8);
412 bias = (int16_t)(bias_val);
419 int hsize =
size >> 1;
420 for (
i = 0;
i < 4;
i++) {
421 int xoff = (
i & 2) == 0 ? 0 : hsize;
422 int yoff = (
i & 1) == 0 ? 0 : hsize;
426 x + xoff, y + yoff, hsize, root_mv,
NULL);
451 int size =
comp == 0 ? tile_size : tile_size >> 1;
453 uint8_t *framebuf = buf->
data[
comp];
458 if ((right ==
size) && (bottom ==
size)) {
463 for (j = 0; j <
h; j++) {
464 for (
i = 0;
i < right;
i++) {
465 framebuf[off +
i] = 0x80;
470 if (bottom !=
size) {
472 for (j = 0; j < bottom; j++) {
474 framebuf[off +
i] = 0x80;
485 const uint8_t *buf = avpkt->
data;
486 int buf_size = avpkt->
size;
495 int skip = bytestream2_get_byte(&gb);
505 if (buf_size < c->mb_width *
c->mb_height) {
516 bytestream2_get_be32(&gb);
517 c->ac_quant = bytestream2_get_byte(&gb);
518 c->luma_dc_quant = 32;
519 c->chroma_dc_quant = 32;
525 for (
i = 0;
i < 3;
i++)
530 for (j = 0; j <
c->mb_height; j++) {
531 for (
i = 0;
i <
c->mb_width;
i++) {
555 mvi_reset(&
c->mvi,
c->pmb_width,
c->pmb_height, 1 <<
c->tile_shift);
557 for (j = 0; j <
c->pmb_height; j++) {
558 for (
i = 0;
i <
c->pmb_width;
i++) {
566 for (plane = 0; plane < 3; plane++) {
567 int16_t x = plane == 0 ?
i <<
c->tile_shift :
i << (
c->tile_shift - 1);
568 int16_t y = plane == 0 ? j <<
c->tile_shift : j << (
c->tile_shift - 1);
569 int16_t
size = plane == 0 ? 1 <<
c->tile_shift : 1 << (
c->tile_shift - 1);
570 int16_t mx = plane == 0 ?
mv.x :
mv.x / 2;
571 int16_t my = plane == 0 ?
mv.y :
mv.y / 2;
578 int x =
i <<
c->tile_shift;
579 int y = j <<
c->tile_shift;
580 int size = 1 <<
c->tile_shift;
587 x =
i << (
c->tile_shift - 1);
588 y = j << (
c->tile_shift - 1);
589 size = 1 << (
c->tile_shift - 1);
621 return mb_ret < 0 ? mb_ret : buf_size;
625 const uint8_t counts[16],
626 const uint16_t **syms)
629 const uint16_t *symbols = *syms;
632 for (
int i = 0;
i < 16;
i++) {
633 unsigned count = counts[
i];
636 for (count += num; num < count; num++)
641 symbols, 2, 2, 0, 0);
656 for (
unsigned i = 0, j = 0, k = 0;;
i++) {
657 if (0x36F & (1 <<
i)) {
663 if (0x1B7 & (1 <<
i)) {
695 if (1
U <<
c->tile_shift !=
c->tile_size ||
c->tile_shift < 1 ||
c->tile_shift > 30) {
696 av_log(avctx,
AV_LOG_ERROR,
"Tile size: %d, is not power of 2 > 1 and < 2^31\n",
c->tile_size);
712 c->pmb_width = (
w +
c->tile_size - 1) >>
c->tile_shift;
713 c->pmb_height = (
h +
c->tile_size - 1) >>
c->tile_shift;
716 c->mvi.mv =
av_calloc(
c->pmb_width * 2,
sizeof(*
c->mvi.mv));
717 if (!
c->pic || !
c->prev || !
c->mvi.mv)
740 .
p.
name =
"clearvideo",
#define AV_LOG_WARNING
Something somehow does not look correct.
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
static int get_bits_left(GetBitContext *gb)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static void comp(unsigned char *dst, ptrdiff_t dst_stride, unsigned char *src, ptrdiff_t src_stride, int add)
static const uint8_t clv_dc_syms[NUM_DC_CODES]
static const int8_t mv[256][2]
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
This structure describes decoded (raw) audio or video data.
static const uint16_t clv_mv_syms[]
static int clv_decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, AVPacket *avpkt)
static void mvi_update_prediction(MV *mv, MV diff)
static const uint8_t clv_flags_syms[][16]
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
static av_cold int clv_decode_init(AVCodecContext *avctx)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static void extend_edges(AVFrame *buf, int tile_size)
AVCodec p
The public AVCodec.
static int decode_mb(CLVContext *c, int x, int y)
static const uint8_t clv_dc_lens[NUM_DC_CODES]
static double val(void *priv, double ch)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static av_cold void clv_init_static(void)
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s your new playground is ready Some little details about what s going which in turn will define variables for the build system and the C
static int ff_thread_once(char *control, void(*routine)(void))
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const uint16_t clv_bias_syms[]
#define FF_ARRAY_ELEMS(a)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
#define FF_CODEC_DECODE_CB(func)
static void clv_dct(int16_t *block)
static int get_sbits(GetBitContext *s, int n)
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
#define CODEC_LONG_NAME(str)
static MV * mvi_predict(MVInfo *mvi, int mb_x, int mb_y)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static VLCElem dc_vlc[1104]
static int bias(int x, int c)
@ AV_PICTURE_TYPE_I
Intra.
static unsigned int get_bits1(GetBitContext *s)
static av_cold int clv_decode_end(AVCodecContext *avctx)
static int copyadd_block(AVCodecContext *avctx, AVFrame *dst, const AVFrame *src, int plane, int x, int y, int dx, int dy, int size, int bias)
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
static void mvi_update_row(MVInfo *mvi)
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
static av_always_inline int bytestream2_tell(GetByteContext *g)
static void mvp(const VVCLocalContext *lc, const int mvp_lx_flag, const int lx, const int8_t *ref_idx, const int amvr_shift, Mv *mv)
int(* init)(AVBSFContext *ctx)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
#define DECLARE_ALIGNED(n, t, v)
static int shift(int a, int b)
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
static const av_cold VLCElem * build_vlc(VLCInitState *state, const uint8_t counts[16], const uint16_t **syms)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
const FFCodec ff_clearvideo_decoder
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
#define i(width, name, range_min, range_max)
static void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static const uint8_t clv_ac_bits[NUM_AC_CODES]
const char * name
Name of the codec implementation.
static LevelCodes lev[4+3+3]
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
void * av_calloc(size_t nmemb, size_t size)
static const uint8_t clv_flags_bits[][16]
const uint8_t ff_zigzag_direct[64]
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available.
static const float pred[4]
#define FFSWAP(type, a, b)
static int copy_block(AVCodecContext *avctx, AVFrame *dst, const AVFrame *src, int plane, int x, int y, int dx, int dy, int size)
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
main external API structure.
static int decode_block(CLVContext *ctx, int16_t *blk, int has_ac, int ac_quant)
#define DCT_TEMPLATE(blk, step, bias, shift, dshift, OP)
static VLCElem ac_vlc[554]
const av_cold VLCElem * ff_vlc_init_tables_from_lengths(VLCInitState *state, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags)
int coded_width
Bitstream width / height, may be different from width/height e.g.
@ AV_PICTURE_TYPE_P
Predicted.
static void mvi_reset(MVInfo *mvi, int mb_w, int mb_h, int mb_size)
#define VLC_INIT_STATIC_TABLE_FROM_LENGTHS(vlc_table, nb_bits, nb_codes, lens, lens_wrap, syms, syms_wrap, syms_size, offset, flags)
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
#define VLC_INIT_STATE(_table)
This structure stores compressed data.
static const uint8_t clv_mv_len_counts[][16]
int width
picture width / height.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
#define flags(name, subs,...)
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
The exact code depends on how similar the blocks are and how related they are to the block
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define MKTAG(a, b, c, d)
static int tile_do_block(AVCodecContext *avctx, AVFrame *dst, const AVFrame *src, int plane, int x, int y, int dx, int dy, int size, int bias)
static int decode_tile(AVCodecContext *avctx, GetBitContext *gb, const LevelCodes *lc, AVFrame *dst, const AVFrame *src, int plane, int x, int y, int size, MV root_mv, MV *pred)
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
static const uint16_t clv_ac_syms[NUM_AC_CODES]
static const uint8_t clv_bias_len_counts[][16]
static const uint8_t mv_syms[2][16][10]