51 #define MAX_REFERENCE_FRAMES 8 53 #define MAX_FRAMES (MAX_REFERENCE_FRAMES + MAX_DELAY + 1) 55 #define MAX_BLOCKSIZE 32 60 #define DIRAC_REF_MASK_REF1 1 61 #define DIRAC_REF_MASK_REF2 2 62 #define DIRAC_REF_MASK_GLOBAL 4 68 #define DELAYED_PIC_REF 4 70 #define CALC_PADDING(size, depth) \ 71 (((size + (1 << depth) - 1) >> depth) << depth) 73 #define DIVRNDUP(a, b) (((a) + (b) - 1) / (b)) 107 typedef struct Plane {
253 return (
int)((x+1
U)*21845 + 10922) >> 16;
259 int i, remove_idx = -1;
261 for (i = 0; framelist[
i]; i++)
262 if (framelist[i]->avframe->display_picture_number == picnum) {
263 remove_pic = framelist[
i];
268 for (i = remove_idx; framelist[
i]; i++)
269 framelist[i] = framelist[i+1];
277 for (i = 0; i < maxframes; i++)
289 int i,
w,
h, top_padding;
292 for (i = 0; i < 3; i++) {
362 for (j = 0; j < 3; j++)
363 for (k = 1; k < 4; k++)
370 for (i = 0; i < 3; i++) {
443 const unsigned sign =
FFSIGN(coeff);
445 coeff = sign*((sign * coeff * qfactor + qoffset) >> 2);
449 #define SIGN_CTX(x) (CTX_SIGN_ZERO + ((x) > 0) - ((x) < 0)) 451 #define UNPACK_ARITH(n, type) \ 452 static inline void coeff_unpack_arith_##n(DiracArith *c, int qfactor, int qoffset, \ 453 SubBand *b, type *buf, int x, int y) \ 455 int sign, sign_pred = 0, pred_ctx = CTX_ZPZN_F1; \ 457 const int mstride = -(b->stride >> (1+b->pshift)); \ 459 const type *pbuf = (type *)b->parent->ibuf; \ 460 const int stride = b->parent->stride >> (1+b->parent->pshift); \ 461 pred_ctx += !!pbuf[stride * (y>>1) + (x>>1)] << 1; \ 463 if (b->orientation == subband_hl) \ 464 sign_pred = buf[mstride]; \ 466 pred_ctx += !(buf[-1] | buf[mstride] | buf[-1 + mstride]); \ 467 if (b->orientation == subband_lh) \ 468 sign_pred = buf[-1]; \ 470 pred_ctx += !buf[mstride]; \ 472 coeff = dirac_get_arith_uint(c, pred_ctx, CTX_COEFF_DATA); \ 474 coeff = (coeff * qfactor + qoffset) >> 2; \ 475 sign = dirac_get_arith_bit(c, SIGN_CTX(sign_pred)); \ 476 coeff = (coeff ^ -sign) + sign; \ 490 int left,
int right,
int top,
int bottom,
491 int blockcnt_one,
int is_arith)
493 int x,
y, zero_block;
494 int qoffset, qfactor;
508 if (s->codeblock_mode && !(s->old_delta_quant && blockcnt_one)) {
514 if (quant > INT_MAX - b->quant || b->quant + quant < 0) {
534 buf = b->ibuf + top * b->stride;
536 for (y = top; y < bottom; y++) {
539 for (x = left; x < right; x++) {
541 coeff_unpack_arith_10(c, qfactor, qoffset, b, (
int32_t*)(buf)+x, x, y);
543 coeff_unpack_arith_8(c, qfactor, qoffset, b, (int16_t*)(buf)+x, x, y);
549 for (y = top; y < bottom; y++) {
552 for (x = left; x < right; x++) {
570 #define INTRA_DC_PRED(n, type) \ 571 static inline void intra_dc_prediction_##n(SubBand *b) \ 573 type *buf = (type*)b->ibuf; \ 576 for (x = 1; x < b->width; x++) \ 577 buf[x] += buf[x-1]; \ 578 buf += (b->stride >> (1+b->pshift)); \ 580 for (y = 1; y < b->height; y++) { \ 581 buf[0] += buf[-(b->stride >> (1+b->pshift))]; \ 583 for (x = 1; x < b->width; x++) { \ 584 int pred = buf[x - 1] + buf[x - (b->stride >> (1+b->pshift))] + buf[x - (b->stride >> (1+b->pshift))-1]; \ 585 buf[x] += divide3(pred); \ 587 buf += (b->stride >> (1+b->pshift)); \ 600 int cb_x, cb_y,
left, right, top, bottom;
603 int cb_width = s->codeblock[b->level + (b->orientation !=
subband_ll)].
width;
604 int cb_height = s->codeblock[b->level + (b->orientation !=
subband_ll)].
height;
605 int blockcnt_one = (cb_width + cb_height) == 2;
617 for (cb_y = 0; cb_y < cb_height; cb_y++) {
618 bottom = (b->height * (cb_y+1LL)) / cb_height;
620 for (cb_x = 0; cb_x < cb_width; cb_x++) {
621 right = (b->width * (cb_x+1LL)) / cb_width;
622 ret =
codeblock(s, b, &gb, &c, left, right, top, bottom, blockcnt_one, is_arith);
630 if (b->orientation ==
subband_ll && s->num_refs == 0) {
632 intra_dc_prediction_10(b);
634 intra_dc_prediction_8(b);
662 int level, num_bands = 0;
665 int damaged_count = 0;
669 for (orientation = !!level; orientation < 4; orientation++) {
671 bands[num_bands++] =
b;
695 ret + 3*level + !!level, 4-!!level,
sizeof(
SubBand));
711 #define PARSE_VALUES(type, x, gb, ebits, buf1, buf2) \ 712 type *buf = (type *)buf1; \ 713 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \ 714 if (get_bits_count(gb) >= ebits) \ 717 buf = (type *)buf2; \ 718 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \ 719 if (get_bits_count(gb) >= ebits) \ 724 int slice_x,
int slice_y,
int bits_end,
728 int right = b1->
width *(slice_x+1) / s->
num_x;
732 int qfactor, qoffset;
750 for (y = top; y < bottom; y++) {
751 for (x = left; x < right; x++) {
760 for (y = top; y < bottom; y++) {
761 for (x = left; x < right; x++) {
790 for (orientation = !!level; orientation < 4; orientation++) {
799 chroma_bits = 8*slice->
bytes - 7 - length_bits - luma_bits;
803 for (orientation = !!level; orientation < 4; orientation++) {
859 for (orientation = !!level; orientation < 4; orientation++) {
867 for (i = 0; i < 3; i++) {
868 int coef_num, coef_par, off = 0;
887 if (coef_num > coef_par) {
888 const int start_b = coef_par * (1 << (s->
pshift + 1));
889 const int end_b = coef_num * (1 << (s->
pshift + 1));
890 memset(&tmp_buf[start_b], 0, end_b - start_b);
895 for (orientation = !!level; orientation < 4; orientation++) {
922 for (i = 0; i < s->
num_x; i++)
934 int slice_x, slice_y, bufsize;
935 int64_t coef_buf_size, bytes = 0;
955 coef_buf_size = (coef_buf_size << (1 + s->
pshift)) + 512;
976 for (slice_y = 0; bufsize > 0 && slice_y < s->
num_y; slice_y++) {
977 for (slice_x = 0; bufsize > 0 && slice_x < s->
num_x; slice_x++) {
979 for (i = 0; i < 3; i++) {
980 if (bytes <= bufsize/8)
983 if (bytes >= INT_MAX || bytes*8 > bufsize) {
988 slices[slice_num].
bytes = bytes;
989 slices[slice_num].
slice_x = slice_x;
990 slices[slice_num].
slice_y = slice_y;
995 if (bufsize/8 >= bytes)
1009 for (slice_y = 0; bufsize > 0 && slice_y < s->
num_y; slice_y++) {
1010 for (slice_x = 0; bufsize > 0 && slice_x < s->
num_x; slice_x++) {
1013 if (bytes >= INT_MAX || bytes*8 > bufsize) {
1017 slices[slice_num].
bytes = bytes;
1018 slices[slice_num].
slice_x = slice_x;
1019 slices[slice_num].
slice_y = slice_y;
1024 if (bufsize/8 >= bytes)
1036 intra_dc_prediction_10(&s->
plane[0].
band[0][0]);
1037 intra_dc_prediction_10(&s->
plane[1].
band[0][0]);
1038 intra_dc_prediction_10(&s->
plane[2].
band[0][0]);
1040 intra_dc_prediction_8(&s->
plane[0].
band[0][0]);
1041 intra_dc_prediction_8(&s->
plane[1].
band[0][0]);
1042 intra_dc_prediction_8(&s->
plane[2].
band[0][0]);
1053 for (i = 0; i < 3; i++) {
1065 for (orientation = !!level; orientation < 4; orientation++) {
1076 if (orientation & 1)
1078 if (orientation > 1)
1105 static const uint8_t default_blen[] = { 4, 12, 16, 24 };
1139 "invalid x/y block length (%d/%d) for x/y chroma shift (%d/%d)\n",
1170 for (ref = 0; ref < s->
num_refs; ref++) {
1237 #define CHECKEDREAD(dst, cond, errmsg) \ 1238 tmp = get_interleaved_ue_golomb(gb); \ 1240 av_log(s->avctx, AV_LOG_ERROR, errmsg); \ 1241 return AVERROR_INVALIDDATA; \ 1305 for (i = !!level; i < 4; i++) {
1316 for (i = 0; i < 4; i++) {
1329 static const uint8_t avgsplit[7] = { 0, 0, 1, 1, 1, 2, 2 };
1338 return avgsplit[sbsplit[-1] + sbsplit[-
stride] + sbsplit[-stride-1]];
1348 return block[-1].
ref & refmask;
1353 pred = (block[-1].
ref & refmask) + (block[-stride].
ref & refmask) + (block[-stride-1].
ref & refmask);
1354 return (pred >> 1) & refmask;
1361 memset(block->
u.
dc, 0,
sizeof(block->
u.
dc));
1363 if (x && !(block[-1].
ref & 3)) {
1364 for (i = 0; i < 3; i++)
1365 block->
u.
dc[i] += block[-1].
u.
dc[i];
1369 if (y && !(block[-stride].
ref & 3)) {
1370 for (i = 0; i < 3; i++)
1371 block->
u.
dc[i] += block[-stride].
u.
dc[i];
1375 if (x && y && !(block[-1-stride].ref & 3)) {
1376 for (i = 0; i < 3; i++)
1377 block->
u.
dc[i] += block[-1-stride].
u.
dc[i];
1382 for (i = 0; i < 3; i++)
1383 block->
u.
dc[i] = (block->
u.
dc[i]+1)>>1;
1384 }
else if (n == 3) {
1385 for (i = 0; i < 3; i++)
1393 int refmask = ref+1;
1397 if (x && (block[-1].ref & mask) == refmask)
1398 pred[n++] = block[-1].
u.
mv[
ref];
1400 if (y && (block[-stride].ref & mask) == refmask)
1403 if (x && y && (block[-stride-1].ref & mask) == refmask)
1404 pred[n++] = block[-stride-1].
u.
mv[
ref];
1412 block->
u.
mv[
ref][0] = pred[0][0];
1413 block->
u.
mv[
ref][1] = pred[0][1];
1416 block->
u.
mv[
ref][0] = (pred[0][0] + pred[1][0] + 1) >> 1;
1417 block->
u.
mv[
ref][1] = (pred[0][1] + pred[1][1] + 1) >> 1;
1420 block->
u.
mv[
ref][0] =
mid_pred(pred[0][0], pred[1][0], pred[2][0]);
1421 block->
u.
mv[
ref][1] =
mid_pred(pred[0][1], pred[1][1], pred[2][1]);
1434 int64_t m = (1<<ep) - (c[0]*(int64_t)x + c[1]*(int64_t)y);
1435 int64_t mx = m * (int64_t)((
A[0][0] * (int64_t)x +
A[0][1]*(int64_t)y) + (1LL<<ez) * b[0]);
1436 int64_t my = m * (int64_t)((
A[1][0] * (int64_t)x +
A[1][1]*(int64_t)y) + (1LL<<ez) * b[1]);
1438 block->
u.
mv[
ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
1439 block->
u.
mv[
ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
1457 for (i = 0; i < 3; i++)
1468 if (block->
ref & (i+1)) {
1472 pred_mv(block, stride, x, y, i);
1487 for (x = 1; x <
size; x++)
1490 for (y = 1; y <
size; y++) {
1492 for (x = 0; x <
size; x++)
1519 for (y = 0; y < s->
sbheight; y++) {
1520 for (x = 0; x < s->
sbwidth; x++) {
1531 for (i = 0; i < s->
num_refs; i++) {
1535 for (i = 0; i < 3; i++)
1539 for (x = 0; x < s->
sbwidth; x++) {
1543 for (q = 0; q < blkcnt; q++)
1544 for (p = 0; p < blkcnt; p++) {
1545 int bx = 4 * x + p*
step;
1546 int by = 4 * y + q*
step;
1553 for (i = 0; i < 4 + 2*s->
num_refs; i++) {
1563 #define ROLLOFF(i) offset == 1 ? ((i) ? 5 : 3) : \ 1564 (1 + (6*(i) + offset - 1) / (2*offset - 1)) 1568 else if (i > blen-1 - 2*offset)
1574 int left,
int right,
int wy)
1577 for (x = 0; left && x < p->
xblen >> 1; x++)
1578 obmc_weight[x] = wy*8;
1579 for (; x < p->
xblen >> right; x++)
1581 for (; x < p->
xblen; x++)
1582 obmc_weight[x] = wy*8;
1588 int left,
int right,
int top,
int bottom)
1591 for (y = 0; top && y < p->
yblen >> 1; y++) {
1595 for (; y < p->
yblen >> bottom; y++) {
1600 for (; y < p->
yblen; y++) {
1612 if (top || bottom || by == 1) {
1647 int x,
int y,
int ref,
int plane)
1651 int motion_x = block->
u.
mv[
ref][0];
1652 int motion_y = block->
u.
mv[
ref][1];
1653 int mx, my,
i, epel, nplanes = 0;
1676 src[0] = ref_hpel[(my>>1)+(mx>>2)] + y*p->
stride +
x;
1680 for (i = 0; i < 4; i++)
1681 src[i] = ref_hpel[i] + y*p->
stride + x;
1705 src[!mx] = src[2 + !!mx];
1707 }
else if (!(my&3)) {
1708 src[0] = src[(my>>1) ];
1709 src[1] = src[(my>>1)+1];
1730 for (i = 0; i < nplanes; i++) {
1738 return (nplanes>>1) + epel;
1742 uint8_t *obmc_weight,
int xblen,
int yblen)
1747 for (y = 0; y < yblen; y++) {
1748 for (x = 0; x < xblen; x += 2) {
1749 dst[
x ] += dc * obmc_weight[
x ];
1750 dst[x+1] += dc * obmc_weight[x+1];
1758 uint16_t *mctmp,
uint8_t *obmc_weight,
1759 int plane,
int dstx,
int dsty)
1765 switch (block->
ref&3) {
1771 idx =
mc_subpel(s, block, src, dstx, dsty, (block->
ref&3)-1, plane);
1778 idx =
mc_subpel(s, block, src, dstx, dsty, 0, plane);
1780 idx =
mc_subpel(s, block, src, dstx, dsty, 1, plane);
1801 for (x = 1; x < s->
blwidth-1; x++) {
1843 for (i = 1; i < 4; i++) {
1855 ref->
hpel[plane][3], ref->
hpel[plane][0],
1879 for (comp = 0; comp < 3; comp++) {
1890 for (comp = 0; comp < 3; comp++) {
1895 for (i = 0; i < 4; i++)
1911 for (y = 0; y < p->
height; y += 16) {
1924 for (i = 0; i < s->
num_refs; i++) {
1933 for (y = 0; y < s->
blheight; y++) {
1935 start =
FFMAX(dsty, 0);
1936 uint16_t *mctmp = s->
mctmp + y*rowheight;
1944 h = p->
ybsep - (start - dsty);
1949 mc_row(s, blocks, mctmp, comp, dsty);
1970 int chroma_x_shift, chroma_y_shift;
1982 for (i = 0; f->
data[
i]; i++) {
1999 unsigned retire, picnum;
2001 int64_t refdist, refnum;
2016 for (i = 0; i < s->
num_refs; i++) {
2018 refdist = INT64_MAX;
2053 if (retire != picnum) {
2116 #define DATA_UNIT_HEADER_SIZE 13 2132 parse_code = buf[4];
2192 if (sscanf(buf+14,
"Schroedinger %d.%d.%d", ver, ver+1, ver+2) == 3)
2193 if (ver[0] == 1 && ver[1] == 0 && ver[2] <= 7)
2196 }
else if (parse_code & 0x8) {
2214 tmp = parse_code & 0x03;
2220 s->
is_arith = (parse_code & 0x48) == 0x08;
2221 s->
low_delay = (parse_code & 0x88) == 0x88;
2226 pic->
reference = (parse_code & 0x0C) == 0x0C;
2267 int buf_size = pkt->
size;
2270 unsigned data_unit_size;
2291 if (buf[buf_idx ] ==
'B' && buf[buf_idx+1] ==
'B' &&
2292 buf[buf_idx+2] ==
'C' && buf[buf_idx+3] ==
'D')
2299 data_unit_size =
AV_RB32(buf+buf_idx+5);
2300 if (data_unit_size > buf_size - buf_idx || !data_unit_size) {
2301 if(data_unit_size > buf_size - buf_idx)
2303 "Data unit with size %d is larger than input buffer, discarding\n",
2315 buf_idx += data_unit_size;
2339 if (delayed_frame) {
#define CHECKEDREAD(dst, cond, errmsg)
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
#define UNPACK_ARITH(n, type)
const int32_t ff_dirac_qscale_tab[116]
#define PARSE_VALUES(type, x, gb, ebits, buf1, buf2)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static av_cold int dirac_decode_end(AVCodecContext *avctx)
#define av_realloc_f(p, o, n)
This structure describes decoded (raw) audio or video data.
dirac_weight_func weight_func
ptrdiff_t const GLvoid * data
static void flush(AVCodecContext *avctx)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
DiracFrame * ref_frames[MAX_REFERENCE_FRAMES+1]
static int divide3(int x)
static int dirac_decode_frame_internal(DiracContext *s)
Dirac Specification -> 13.0 Transform data syntax.
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.
static void skip_bits_long(GetBitContext *s, int n)
Skips the specified number of bits.
static av_cold int init(AVCodecContext *avctx)
static void propagate_block_data(DiracBlock *block, int stride, int size)
Copies the current block to the other blocks covered by the current superblock split mode...
enum AVColorRange color_range
MPEG vs JPEG YUV range.
dirac_weight_func weight_dirac_pixels_tab[3]
#define DELAYED_PIC_REF
Value of Picture.reference when Picture is not a reference picture, but is held for delayed output...
void ff_dirac_init_arith_decoder(DiracArith *c, GetBitContext *gb, int length)
static int subband_coeffs(DiracContext *s, int x, int y, int p, SliceCoeffs c[MAX_DWT_LEVELS])
#define DATA_UNIT_HEADER_SIZE
Dirac Specification -> 9.6 Parse Info Header Syntax.
void(* add_rect_clamped)(uint8_t *dst, const uint16_t *src, int stride, const int16_t *idwt, int idwt_stride, int width, int height)
static void global_mv(DiracContext *s, DiracBlock *block, int x, int y, int ref)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static int dirac_get_arith_uint(DiracArith *c, int follow_ctx, int data_ctx)
static int alloc_buffers(DiracContext *s, int stride)
static void error(const char *err)
static void dirac_decode_flush(AVCodecContext *avctx)
const uint8_t * coeff_data
static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame)
static int dirac_unpack_idwt_params(DiracContext *s)
Dirac Specification -> 11.3 Wavelet transform data.
#define DIRAC_REF_MASK_REF2
static int decode_hq_slice(DiracContext *s, DiracSlice *slice, uint8_t *tmp_buf)
VC-2 Specification -> 13.5.3 hq_slice(sx,sy)
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
int av_dirac_parse_sequence_header(AVDiracSeqHeader **pdsh, const uint8_t *buf, size_t buf_size, void *log_ctx)
Parse a Dirac sequence header.
unsigned weight_log2denom
void(* draw_edges)(uint8_t *buf, int wrap, int width, int height, int w, int h, int sides)
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
void(* emulated_edge_mc)(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_linesize, ptrdiff_t src_linesize, int block_w, int block_h, int src_x, int src_y, int w, int h)
Copy a rectangular area of samples to a temporary buffer and replicate the border samples...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
DiracFrame * delay_frames[MAX_DELAY+1]
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
The exact code depends on how similar the blocks are and how related they are to the block
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Interface to Dirac Decoder/Encoder.
static int decode_component(DiracContext *s, int comp)
Dirac Specification -> [DIRAC_STD] 13.4.1 core_transform_data()
static int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset)
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 offset
static av_cold int dirac_decode_init(AVCodecContext *avctx)
uint8_t quant[MAX_DWT_LEVELS][4]
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
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
static int dirac_get_se_golomb(GetBitContext *gb)
#define u(width, name, range_min, range_max)
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
DiracSlice * slice_params_buf
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
static AVOnce dirac_arith_init
static void free_sequence_buffers(DiracContext *s)
static int get_bits_count(const GetBitContext *s)
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
bitstream reader API header.
static const uint8_t epel_weights[4][4][4]
static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
Dirac Specification -> 13.5.2 Slices.
void(* avg_dirac_pixels_tab[3][4])(uint8_t *dst, const uint8_t *src[5], int stride, int h)
static void pred_block_dc(DiracBlock *block, int stride, int x, int y)
static int get_bits_left(GetBitContext *gb)
const int32_t ff_dirac_qoffset_intra_tab[120]
av_cold void ff_diracdsp_init(DiracDSPContext *c)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *pkt)
SubBand band[DWT_LEVELS_3D][4]
static const uint16_t mask[17]
static av_always_inline int decode_subband_internal(DiracContext *s, SubBand *b, int is_arith)
Dirac Specification -> 13.4.2 Non-skipped subbands.
void(* add_obmc)(uint16_t *dst, const uint8_t *src, int stride, const uint8_t *obmc_weight, int yblen)
#define DIRAC_REF_MASK_GLOBAL
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
static int pred_sbsplit(uint8_t *sbsplit, int stride, int x, int y)
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static int add_frame(DiracFrame *framelist[], int maxframes, DiracFrame *frame)
static void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
const uint8_t ff_dirac_default_qmat[7][4][4]
static int interpolate_refplane(DiracContext *s, DiracFrame *ref, int plane, int width, int height)
static int mc_subpel(DiracContext *s, DiracBlock *block, const uint8_t *src[5], int x, int y, int ref, int plane)
For block x,y, determine which of the hpel planes to do bilinear interpolation from and set src[] to ...
const char * name
Name of the codec implementation.
DiracFrame * current_picture
int64_t max_pixels
The number of pixels per image to maximally accept.
#define DIRAC_MAX_QUANT_INDEX
unsigned old_delta_quant
schroedinger older than 1.0.8 doesn't store quant delta if only one codebook exists in a band ...
int ff_dirac_golomb_read_16bit(const uint8_t *buf, int bytes, uint8_t *_dst, int coeffs)
struct DiracContext::@53 lowdelay
static int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf, int size)
static char * split(char *message, char delim)
#define INTRA_DC_PRED(n, type)
Dirac Specification -> 13.3 intra_dc_prediction(band)
static int codeblock(DiracContext *s, SubBand *b, GetBitContext *gb, DiracArith *c, int left, int right, int top, int bottom, int blockcnt_one, int is_arith)
Decode the coeffs in the rectangle defined by left, right, top, bottom [DIRAC_STD] 13...
static void init_planes(DiracContext *s)
static void decode_block_params(DiracContext *s, DiracArith arith[8], DiracBlock *block, int stride, int x, int y)
enum AVPictureType pict_type
Picture type of the frame.
int display_picture_number
picture number in display order
#define CALC_PADDING(size, depth)
static int decode_hq_slice_row(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
void(* avg_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h)
static void block_mc(DiracContext *s, DiracBlock *block, uint16_t *mctmp, uint8_t *obmc_weight, int plane, int dstx, int dsty)
static DiracFrame * remove_frame(DiracFrame *framelist[], int picnum)
void ff_spatial_idwt_slice2(DWTContext *d, int y)
int width
picture width / height.
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
static int dirac_unpack_prediction_parameters(DiracContext *s)
Unpack the motion compensation parameters Dirac Specification -> 11.2 Picture prediction data...
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
struct DiracContext::@54 highquality
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
struct DiracContext::@55 globalmc[2]
MpegvideoEncDSPContext mpvencdsp
static void mc_row(DiracContext *s, DiracBlock *block, uint16_t *mctmp, int plane, int dsty)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static void select_dsp_funcs(DiracContext *s, int width, int height, int xblen, int yblen)
uint8_t * edge_emu_buffer_base
int thread_count
thread count is used to decide how many independent tasks should be passed to execute() ...
static void init_obmc_weights(DiracContext *s, Plane *p, int by)
static const float pred[4]
void(* add_dirac_obmc[3])(uint16_t *dst, const uint8_t *src, int stride, const uint8_t *obmc_weight, int yblen)
static void comp(unsigned char *dst, ptrdiff_t dst_stride, unsigned char *src, ptrdiff_t src_stride, int add)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
static const int8_t mv[256][2]
static double b1(void *priv, double x, double y)
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
static int get_buffer_with_edge(AVCodecContext *avctx, AVFrame *f, int flags)
Libavcodec external API header.
void(* dirac_biweight_func)(uint8_t *dst, const uint8_t *src, int stride, int log2_denom, int weightd, int weights, int h)
uint8_t * edge_emu_buffer[4]
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
const int ff_dirac_qoffset_inter_tab[122]
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
main external API structure.
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2]...the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so...,+,-,+,-,+,+,-,+,-,+,...hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32-hcoeff[1]-hcoeff[2]-...a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2}an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||.........intra?||||:Block01:yes no||||:Block02:.................||||:Block03::y DC::ref index:||||:Block04::cb DC::motion x:||||.........:cr DC::motion y:||||.................|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------------------------------|||Y subbands||Cb subbands||Cr subbands||||------||------||------|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||------||------||------||||------||------||------|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||------||------||------||||------||------||------|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||------||------||------||||------||------||------|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------------------------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction------------|\Dequantization-------------------\||Reference frames|\IDWT|--------------|Motion\|||Frame 0||Frame 1||Compensation.OBMC v-------|--------------|--------------.\------> Frame n output Frame Frame<----------------------------------/|...|-------------------Range Coder:============Binary Range Coder:-------------------The implemented range coder is an adapted version based upon"Range encoding: an algorithm for removing redundancy from a digitised message."by G.N.N.Martin.The symbols encoded by the Snow range coder are bits(0|1).The associated probabilities are not fix but change depending on the symbol mix seen so far.bit seen|new state---------+-----------------------------------------------0|256-state_transition_table[256-old_state];1|state_transition_table[old_state];state_transition_table={0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:-------------------------FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1.the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff)*mv_scale Intra DC Prediction block[y][x] dc[1]
DiracFrame all_frames[MAX_FRAMES]
static const float bands[]
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Arithmetic decoder for Dirac.
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2]...the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so...,+,-,+,-,+,+,-,+,-,+,...hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32-hcoeff[1]-hcoeff[2]-...a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2}an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||.........intra?||||:Block01:yes no||||:Block02:.................||||:Block03::y DC::ref index:||||:Block04::cb DC::motion x:||||.........:cr DC::motion y:||||.................|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------------------------------|||Y subbands||Cb subbands||Cr subbands||||------||------||------|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||------||------||------||||------||------||------|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||------||------||------||||------||------||------|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||------||------||------||||------||------||------|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------------------------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction------------|\Dequantization-------------------\||Reference frames|\IDWT|--------------|Motion\|||Frame 0||Frame 1||Compensation.OBMC v-------|--------------|--------------.\------> Frame n output Frame Frame<----------------------------------/|...|-------------------Range Coder:============Binary Range Coder:-------------------The implemented range coder is an adapted version based upon"Range encoding: an algorithm for removing redundancy from a digitised message."by G.N.N.Martin.The symbols encoded by the Snow range coder are bits(0|1).The associated probabilities are not fix but change depending on the symbol mix seen so far.bit seen|new state---------+-----------------------------------------------0|256-state_transition_table[256-old_state];1|state_transition_table[old_state];state_transition_table={0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:-------------------------FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1.the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
dirac_biweight_func biweight_dirac_pixels_tab[3]
#define MAX_DWT_LEVELS
The spec limits the number of wavelet decompositions to 4 for both level 1 (VC-2) and 128 (long-gop d...
static unsigned int get_bits1(GetBitContext *s)
static int decode_lowdelay(DiracContext *s)
Dirac Specification -> 13.5.1 low_delay_transform_data()
static int dirac_get_arith_bit(DiracArith *c, int ctx)
enum AVColorSpace colorspace
YUV colorspace type.
Rational number (pair of numerator and denominator).
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
dirac_biweight_func biweight_func
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
static int decode_subband_arith(AVCodecContext *avctx, void *b)
static int weight(int i, int blen, int offset)
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
#define flags(name, subs,...)
struct DiracContext::@52 codeblock[MAX_DWT_LEVELS+1]
int ff_dirac_golomb_read_32bit(const uint8_t *buf, int bytes, uint8_t *_dst, int coeffs)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static int pred_block_mode(DiracBlock *block, int stride, int x, int y, int refmask)
void(* dirac_weight_func)(uint8_t *block, int stride, int log2_denom, int weight, int h)
#define MAX_REFERENCE_FRAMES
The spec limits this to 3 for frame coding, but in practice can be as high as 6.
GLint GLenum GLboolean GLsizei stride
static int dirac_decode_picture_header(DiracContext *s)
Dirac Specification -> 11.1.1 Picture Header.
common internal api header.
static int ref[MAX_W *MAX_W]
static void decode_subband(DiracContext *s, GetBitContext *gb, int quant, int slice_x, int slice_y, int bits_end, SubBand *b1, SubBand *b2)
static int decode_subband_golomb(AVCodecContext *avctx, void *arg)
static int dirac_get_arith_int(DiracArith *c, int follow_ctx, int data_ctx)
static void init_obmc_weight_row(Plane *p, uint8_t *obmc_weight, int stride, int left, int right, int wy)
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Core video DSP helper functions.
void(* put_dirac_pixels_tab[3][4])(uint8_t *dst, const uint8_t *src[5], int stride, int h)
dirac_pixels_tab[width][subpel] width is 2 for 32, 1 for 16, 0 for 8 subpel is 0 for fpel and hpel (o...
static int alloc_sequence_buffers(DiracContext *s)
void(* put_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h)
static void init_obmc_weight(Plane *p, uint8_t *obmc_weight, int stride, int left, int right, int top, int bottom)
void(* dequant_subband[4])(uint8_t *src, uint8_t *dst, ptrdiff_t stride, const int qf, const int qs, int tot_v, int tot_h)
static int ff_thread_once(char *control, void(*routine)(void))
int key_frame
1 -> keyframe, 0-> not
static const double coeff[2][5]
static const uint8_t * align_get_bits(GetBitContext *s)
static void add_dc(uint16_t *dst, int dc, int stride, uint8_t *obmc_weight, int xblen, int yblen)
#define av_malloc_array(a, b)
uint8_t * hpel_base[3][4]
#define FFSWAP(type, a, b)
static unsigned get_interleaved_ue_golomb(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
void(* dirac_hpel_filter)(uint8_t *dsth, uint8_t *dstv, uint8_t *dstc, const uint8_t *src, int stride, int width, int height)
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
static double val(void *priv, double ch)
This structure stores compressed data.
void(* put_signed_rect_clamped[3])(uint8_t *dst, int dst_stride, const uint8_t *src, int src_stride, int width, int height)
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
#define DIRAC_REF_MASK_REF1
DiracBlock->ref flags, if set then the block does MC from the given ref.
static int dirac_unpack_block_motion_data(DiracContext *s)
Dirac Specification ->
uint8_t obmc_weight[3][MAX_BLOCKSIZE *MAX_BLOCKSIZE]
int ff_spatial_idwt_init(DWTContext *d, DWTPlane *p, enum dwt_type type, int decomposition_count, int bit_depth)
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
av_cold void ff_dirac_init_arith_tables(void)
void * av_mallocz_array(size_t nmemb, size_t size)
static double b2(void *priv, double x, double y)