48 #define MAX_REFERENCE_FRAMES 8
50 #define MAX_FRAMES (MAX_REFERENCE_FRAMES + MAX_DELAY + 1)
52 #define MAX_BLOCKSIZE 32
57 #define DIRAC_REF_MASK_REF1 1
58 #define DIRAC_REF_MASK_REF2 2
59 #define DIRAC_REF_MASK_GLOBAL 4
65 #define DELAYED_PIC_REF 4
67 #define CALC_PADDING(size, depth) \
68 (((size + (1 << depth) - 1) >> depth) << depth)
70 #define DIVRNDUP(a, b) (((a) + (b) - 1) / (b))
104 typedef struct Plane {
251 return ((x+1)*21845 + 10922) >> 16;
257 int i, remove_idx = -1;
259 for (i = 0; framelist[i]; i++)
260 if (framelist[i]->avframe->display_picture_number == picnum) {
261 remove_pic = framelist[i];
266 for (i = remove_idx; framelist[i]; i++)
267 framelist[i] = framelist[i+1];
275 for (i = 0; i < maxframes; i++)
277 framelist[i] =
frame;
287 int i, w,
h, top_padding;
290 for (i = 0; i < 3; i++) {
360 for (j = 0; j < 3; j++)
361 for (k = 1; k < 4; k++)
368 for (i = 0; i < 3; i++) {
439 const int sign =
FFSIGN(coeff);
441 coeff = sign*((sign * coeff * qfactor + qoffset) >> 2);
445 #define SIGN_CTX(x) (CTX_SIGN_ZERO + ((x) > 0) - ((x) < 0))
447 #define UNPACK_ARITH(n, type) \
448 static inline void coeff_unpack_arith_##n(DiracArith *c, int qfactor, int qoffset, \
449 SubBand *b, type *buf, int x, int y) \
451 int coeff, sign, sign_pred = 0, pred_ctx = CTX_ZPZN_F1; \
452 const int mstride = -(b->stride >> (1+b->pshift)); \
454 const type *pbuf = (type *)b->parent->ibuf; \
455 const int stride = b->parent->stride >> (1+b->parent->pshift); \
456 pred_ctx += !!pbuf[stride * (y>>1) + (x>>1)] << 1; \
458 if (b->orientation == subband_hl) \
459 sign_pred = buf[mstride]; \
461 pred_ctx += !(buf[-1] | buf[mstride] | buf[-1 + mstride]); \
462 if (b->orientation == subband_lh) \
463 sign_pred = buf[-1]; \
465 pred_ctx += !buf[mstride]; \
467 coeff = dirac_get_arith_uint(c, pred_ctx, CTX_COEFF_DATA); \
469 coeff = (coeff * qfactor + qoffset) >> 2; \
470 sign = dirac_get_arith_bit(c, SIGN_CTX(sign_pred)); \
471 coeff = (coeff ^ -sign) + sign; \
485 int left,
int right,
int top,
int bottom,
486 int blockcnt_one,
int is_arith)
488 int x, y, zero_block;
489 int qoffset, qfactor;
503 if (s->codeblock_mode && !(s->old_delta_quant && blockcnt_one)) {
504 int quant = b->quant;
529 buf = b->ibuf + top * b->stride;
531 for (y = top; y < bottom; y++) {
532 for (x = left; x < right; x++) {
534 coeff_unpack_arith_10(c, qfactor, qoffset, b, (
int32_t*)(buf)+x, x, y);
536 coeff_unpack_arith_8(c, qfactor, qoffset, b, (int16_t*)(buf)+x, x, y);
542 for (y = top; y < bottom; y++) {
543 for (x = left; x < right; x++) {
560 #define INTRA_DC_PRED(n, type) \
561 static inline void intra_dc_prediction_##n(SubBand *b) \
563 type *buf = (type*)b->ibuf; \
566 for (x = 1; x < b->width; x++) \
567 buf[x] += buf[x-1]; \
568 buf += (b->stride >> (1+b->pshift)); \
570 for (y = 1; y < b->height; y++) { \
571 buf[0] += buf[-(b->stride >> (1+b->pshift))]; \
573 for (x = 1; x < b->width; x++) { \
574 int pred = buf[x - 1] + buf[x - (b->stride >> (1+b->pshift))] + buf[x - (b->stride >> (1+b->pshift))-1]; \
575 buf[x] += divide3(pred); \
577 buf += (b->stride >> (1+b->pshift)); \
590 int cb_x, cb_y, left, right, top, bottom;
593 int cb_width = s->codeblock[b->level + (b->orientation !=
subband_ll)].
width;
594 int cb_height = s->codeblock[b->level + (b->orientation !=
subband_ll)].
height;
595 int blockcnt_one = (cb_width + cb_height) == 2;
606 for (cb_y = 0; cb_y < cb_height; cb_y++) {
607 bottom = (b->height * (cb_y+1LL)) / cb_height;
609 for (cb_x = 0; cb_x < cb_width; cb_x++) {
610 right = (b->width * (cb_x+1LL)) / cb_width;
611 codeblock(s, b, &gb, &c, left, right, top, bottom, blockcnt_one, is_arith);
617 if (b->orientation ==
subband_ll && s->num_refs == 0) {
619 intra_dc_prediction_10(b);
621 intra_dc_prediction_8(b);
650 int level, num_bands = 0;
654 for (orientation = !!level; orientation < 4; orientation++) {
656 bands[num_bands++] =
b;
679 #define PARSE_VALUES(type, x, gb, ebits, buf1, buf2) \
680 type *buf = (type *)buf1; \
681 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \
682 if (get_bits_count(gb) >= ebits) \
685 buf = (type *)buf2; \
686 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \
687 if (get_bits_count(gb) >= ebits) \
692 int slice_x,
int slice_y,
int bits_end,
696 int right = b1->
width *(slice_x+1) / s->
num_x;
700 int qfactor, qoffset;
718 for (y = top; y < bottom; y++) {
719 for (x = left; x < right; x++) {
728 for (y = top; y < bottom; y++) {
729 for (x = left; x < right; x++) {
758 for (orientation = !!level; orientation < 4; orientation++) {
767 chroma_bits = 8*slice->
bytes - 7 - length_bits - luma_bits;
771 for (orientation = !!level; orientation < 4; orientation++) {
812 int i,
level, orientation, quant_idx;
827 for (orientation = !!level; orientation < 4; orientation++) {
835 for (i = 0; i < 3; i++) {
836 int coef_num, coef_par, off = 0;
850 length, tmp_buf, coef_num);
853 length, tmp_buf, coef_num);
855 if (coef_num > coef_par) {
856 const int start_b = coef_par * (1 << (s->
pshift + 1));
857 const int end_b = coef_num * (1 << (s->
pshift + 1));
858 memset(&tmp_buf[start_b], 0, end_b - start_b);
863 for (orientation = !!level; orientation < 4; orientation++) {
870 qfactor[
level][orientation],
871 qoffset[
level][orientation],
890 for (i = 0; i < s->
num_x; i++)
902 int slice_x, slice_y, bufsize;
903 int64_t coef_buf_size, bytes = 0;
922 coef_buf_size = (coef_buf_size << (1 + s->
pshift)) + 512;
943 for (slice_y = 0; bufsize > 0 && slice_y < s->
num_y; slice_y++) {
944 for (slice_x = 0; bufsize > 0 && slice_x < s->
num_x; slice_x++) {
946 for (i = 0; i < 3; i++) {
947 if (bytes <= bufsize/8)
950 if (bytes >= INT_MAX || bytes*8 > bufsize) {
955 slices[slice_num].
bytes = bytes;
956 slices[slice_num].
slice_x = slice_x;
957 slices[slice_num].
slice_y = slice_y;
962 if (bufsize/8 >= bytes)
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++) {
980 slices[slice_num].
bytes = bytes;
981 slices[slice_num].
slice_x = slice_x;
982 slices[slice_num].
slice_y = slice_y;
987 if (bufsize/8 >= bytes)
999 intra_dc_prediction_10(&s->
plane[0].
band[0][0]);
1000 intra_dc_prediction_10(&s->
plane[1].
band[0][0]);
1001 intra_dc_prediction_10(&s->
plane[2].
band[0][0]);
1003 intra_dc_prediction_8(&s->
plane[0].
band[0][0]);
1004 intra_dc_prediction_8(&s->
plane[1].
band[0][0]);
1005 intra_dc_prediction_8(&s->
plane[2].
band[0][0]);
1014 int i, w,
h,
level, orientation;
1016 for (i = 0; i < 3; i++) {
1028 for (orientation = !!level; orientation < 4; orientation++) {
1039 if (orientation & 1)
1041 if (orientation > 1)
1068 static const uint8_t default_blen[] = { 4, 12, 16, 24 };
1102 "invalid x/y block length (%d/%d) for x/y chroma shift (%d/%d)\n",
1133 for (ref = 0; ref < s->
num_refs; ref++) {
1191 #define CHECKEDREAD(dst, cond, errmsg) \
1192 tmp = get_interleaved_ue_golomb(gb); \
1194 av_log(s->avctx, AV_LOG_ERROR, errmsg); \
1195 return AVERROR_INVALIDDATA; \
1266 for (i = 0; i < 4; i++) {
1279 static const uint8_t avgsplit[7] = { 0, 0, 1, 1, 1, 2, 2 };
1288 return avgsplit[sbsplit[-1] + sbsplit[-
stride] + sbsplit[-stride-1]];
1298 return block[-1].
ref & refmask;
1303 pred = (block[-1].
ref & refmask) + (block[-stride].
ref & refmask) + (block[-stride-1].
ref & refmask);
1304 return (pred >> 1) & refmask;
1311 memset(block->
u.
dc, 0,
sizeof(block->
u.
dc));
1313 if (x && !(block[-1].
ref & 3)) {
1314 for (i = 0; i < 3; i++)
1315 block->
u.
dc[i] += block[-1].
u.
dc[i];
1319 if (y && !(block[-stride].
ref & 3)) {
1320 for (i = 0; i < 3; i++)
1321 block->
u.
dc[i] += block[-stride].
u.
dc[i];
1325 if (x && y && !(block[-1-stride].ref & 3)) {
1326 for (i = 0; i < 3; i++)
1327 block->
u.
dc[i] += block[-1-stride].
u.
dc[i];
1332 for (i = 0; i < 3; i++)
1333 block->
u.
dc[i] = (block->
u.
dc[i]+1)>>1;
1334 }
else if (n == 3) {
1335 for (i = 0; i < 3; i++)
1343 int refmask = ref+1;
1347 if (x && (block[-1].ref & mask) == refmask)
1348 pred[n++] = block[-1].
u.
mv[
ref];
1350 if (y && (block[-stride].ref & mask) == refmask)
1353 if (x && y && (block[-stride-1].ref & mask) == refmask)
1354 pred[n++] = block[-stride-1].
u.
mv[
ref];
1362 block->
u.
mv[
ref][0] = pred[0][0];
1363 block->
u.
mv[
ref][1] = pred[0][1];
1366 block->
u.
mv[
ref][0] = (pred[0][0] + pred[1][0] + 1) >> 1;
1367 block->
u.
mv[
ref][1] = (pred[0][1] + pred[1][1] + 1) >> 1;
1370 block->
u.
mv[
ref][0] =
mid_pred(pred[0][0], pred[1][0], pred[2][0]);
1371 block->
u.
mv[
ref][1] =
mid_pred(pred[0][1], pred[1][1], pred[2][1]);
1384 int m = (1<<ep) - (c[0]*x + c[1]*y);
1385 int mx = m * ((
A[0][0] * x +
A[0][1]*y) + (1<<ez) * b[0]);
1386 int my = m * ((
A[1][0] * x +
A[1][1]*y) + (1<<ez) * b[1]);
1388 block->
u.
mv[
ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
1389 block->
u.
mv[
ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
1393 int stride,
int x,
int y)
1407 for (i = 0; i < 3; i++)
1418 if (block->
ref & (i+1)) {
1422 pred_mv(block, stride, x, y, i);
1437 for (x = 1; x <
size; x++)
1440 for (y = 1; y <
size; y++) {
1442 for (x = 0; x <
size; x++)
1469 for (y = 0; y < s->
sbheight; y++) {
1470 for (x = 0; x < s->
sbwidth; x++) {
1481 for (i = 0; i < s->
num_refs; i++) {
1485 for (i = 0; i < 3; i++)
1489 for (x = 0; x < s->
sbwidth; x++) {
1493 for (q = 0; q < blkcnt; q++)
1494 for (p = 0; p < blkcnt; p++) {
1495 int bx = 4 * x + p*step;
1496 int by = 4 * y + q*step;
1508 #define ROLLOFF(i) offset == 1 ? ((i) ? 5 : 3) : \
1509 (1 + (6*(i) + offset - 1) / (2*offset - 1))
1513 else if (i > blen-1 - 2*offset)
1519 int left,
int right,
int wy)
1522 for (x = 0; left && x < p->
xblen >> 1; x++)
1523 obmc_weight[x] = wy*8;
1524 for (; x < p->
xblen >> right; x++)
1526 for (; x < p->
xblen; x++)
1527 obmc_weight[x] = wy*8;
1533 int left,
int right,
int top,
int bottom)
1536 for (y = 0; top && y < p->
yblen >> 1; y++) {
1540 for (; y < p->
yblen >> bottom; y++) {
1545 for (; y < p->
yblen; y++) {
1557 if (top || bottom || by == 1) {
1596 int motion_x = block->
u.
mv[
ref][0];
1597 int motion_y = block->
u.
mv[
ref][1];
1598 int mx, my, i, epel, nplanes = 0;
1621 src[0] = ref_hpel[(my>>1)+(mx>>2)] + y*p->
stride + x;
1625 for (i = 0; i < 4; i++)
1626 src[i] = ref_hpel[i] + y*p->
stride + x;
1650 src[!mx] = src[2 + !!mx];
1652 }
else if (!(my&3)) {
1653 src[0] = src[(my>>1) ];
1654 src[1] = src[(my>>1)+1];
1675 for (i = 0; i < nplanes; i++) {
1683 return (nplanes>>1) + epel;
1687 uint8_t *obmc_weight,
int xblen,
int yblen)
1692 for (y = 0; y < yblen; y++) {
1693 for (x = 0; x < xblen; x += 2) {
1694 dst[x ] += dc * obmc_weight[x ];
1695 dst[x+1] += dc * obmc_weight[x+1];
1703 uint16_t *mctmp,
uint8_t *obmc_weight,
1704 int plane,
int dstx,
int dsty)
1710 switch (block->
ref&3) {
1716 idx =
mc_subpel(s, block, src, dstx, dsty, (block->
ref&3)-1, plane);
1723 idx =
mc_subpel(s, block, src, dstx, dsty, 0, plane);
1725 idx =
mc_subpel(s, block, src, dstx, dsty, 1, plane);
1746 for (x = 1; x < s->
blwidth-1; x++) {
1788 for (i = 1; i < 4; i++) {
1800 ref->
hpel[plane][3], ref->
hpel[plane][0],
1818 int y, i,
comp, dsty;
1824 for (comp = 0; comp < 3; comp++) {
1835 for (comp = 0; comp < 3; comp++) {
1840 for (i = 0; i < 4; i++)
1854 for (y = 0; y < p->
height; y += 16) {
1867 for (i = 0; i < s->
num_refs; i++) {
1876 for (y = 0; y < s->
blheight; y++) {
1879 uint16_t *mctmp = s->
mctmp + y*rowheight;
1892 mc_row(s, blocks, mctmp, comp, dsty);
1913 int chroma_x_shift, chroma_y_shift;
1922 for (i = 0; f->
data[i]; i++) {
1939 unsigned retire, picnum;
1941 int64_t refdist, refnum;
1956 for (i = 0; i < s->
num_refs; i++) {
1958 refdist = INT64_MAX;
1991 if (retire != picnum) {
2054 #define DATA_UNIT_HEADER_SIZE 13
2070 parse_code = buf[4];
2123 if (sscanf(buf+14,
"Schroedinger %d.%d.%d", ver, ver+1, ver+2) == 3)
2124 if (ver[0] == 1 && ver[1] == 0 && ver[2] <= 7)
2127 }
else if (parse_code & 0x8) {
2145 tmp = parse_code & 0x03;
2151 s->
is_arith = (parse_code & 0x48) == 0x08;
2152 s->
low_delay = (parse_code & 0x88) == 0x88;
2157 pic->
reference = (parse_code & 0x0C) == 0x0C;
2198 int buf_size = pkt->
size;
2201 unsigned data_unit_size;
2222 if (buf[buf_idx ] ==
'B' && buf[buf_idx+1] ==
'B' &&
2223 buf[buf_idx+2] ==
'C' && buf[buf_idx+3] ==
'D')
2230 data_unit_size =
AV_RB32(buf+buf_idx+5);
2231 if (data_unit_size > buf_size - buf_idx || !data_unit_size) {
2232 if(data_unit_size > buf_size - buf_idx)
2234 "Data unit with size %d is larger than input buffer, discarding\n",
2246 buf_idx += data_unit_size;
2270 if (delayed_frame) {
#define CHECKEDREAD(dst, cond, errmsg)
int ff_dirac_golomb_read_32bit(DiracGolombLUT *lut_ctx, const uint8_t *buf, int bytes, uint8_t *_dst, int coeffs)
void(* add_obmc)(uint16_t *dst, const uint8_t *src, int stride, const uint8_t *obmc_weight, int yblen)
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
#define UNPACK_ARITH(n, type)
const char const char void * val
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)
static void 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...
#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)
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.
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)
int ff_dirac_golomb_read_16bit(DiracGolombLUT *lut_ctx, const uint8_t *buf, int bytes, uint8_t *_dst, int coeffs)
struct DiracContext::@58 codeblock[MAX_DWT_LEVELS+1]
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)
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
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
DiracFrame * delay_frames[MAX_DELAY+1]
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...
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
void(* add_rect_clamped)(uint8_t *dst, const uint16_t *src, int stride, const int16_t *idwt, int idwt_stride, int width, int height)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Interface to Dirac Decoder/Encoder.
static int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset)
static av_cold int dirac_decode_init(AVCodecContext *avctx)
uint8_t quant[MAX_DWT_LEVELS][4]
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)
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 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.
struct DiracContext::@59 lowdelay
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)
av_cold int ff_dirac_golomb_reader_init(DiracGolombLUT **lut_ctx)
static int get_bits_left(GetBitContext *gb)
const int32_t ff_dirac_qoffset_intra_tab[120]
av_cold void ff_diracdsp_init(DiracDSPContext *c)
int width
width and height of the video frame
#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)
void(* dirac_hpel_filter)(uint8_t *dsth, uint8_t *dstv, uint8_t *dstc, const uint8_t *src, int stride, int width, int height)
static const uint16_t mask[17]
#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)
#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
#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 ...
static const uint8_t offset[127][2]
static void * av_mallocz_array(size_t nmemb, size_t size)
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 void init_planes(DiracContext *s)
static void decode_block_params(DiracContext *s, DiracArith arith[8], DiracBlock *block, int stride, int x, int y)
SubBand band[DWT_LEVELS][4]
struct DiracContext::@61 globalmc[2]
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.
av_cold void ff_dirac_golomb_reader_end(DiracGolombLUT **lut_ctx)
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)
void avcodec_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.
uint8_t * edge_emu_buffer_base
static void decode_component(DiracContext *s, int comp)
Dirac Specification -> [DIRAC_STD] 13.4.1 core_transform_data()
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)
#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 int get_buffer_with_edge(AVCodecContext *avctx, AVFrame *f, int flags)
static av_always_inline void decode_subband_internal(DiracContext *s, SubBand *b, int is_arith)
Dirac Specification -> 13.4.2 Non-skipped subbands.
Libavcodec external API header.
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.
void(* dirac_weight_func)(uint8_t *block, int stride, int log2_denom, int weight, int h)
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
DiracFrame all_frames[MAX_FRAMES]
Arithmetic decoder for Dirac.
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()
struct DiracContext::@60 highquality
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.
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)
DiracGolombLUT * reader_ctx
#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)
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)
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.
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)
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.
void(* draw_edges)(uint8_t *buf, int wrap, int width, int height, int w, int h, int sides)
void(* dirac_biweight_func)(uint8_t *dst, const uint8_t *src, int stride, int log2_denom, int weightd, int weights, int h)
int key_frame
1 -> keyframe, 0-> not
static const double coeff[2][5]
static const uint8_t * align_get_bits(GetBitContext *s)
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> dc
static void comp(unsigned char *dst, int dst_stride, unsigned char *src, int src_stride, int add)
static void add_dc(uint16_t *dst, int dc, int stride, uint8_t *obmc_weight, int xblen, int yblen)
static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
#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)
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)