41 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3,
42 4, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 18, 20,
43 22, 24, 26, 28, 30, 33, 33, 35, 35, 36, 37, 37, 39, 39, 42, 44,
44 46, 48, 50, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
48 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
49 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6,
50 6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 14,
51 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27
55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
57 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,
58 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9
80 if((
abs(mvP->
x - mvQ->
x) >= 4) ||
81 (
abs(mvP->
y - mvQ->
y) >= 4) ||
87 if((
abs(mvP->
x - mvQ->
x) >= 4) ||
88 (
abs(mvP->
y - mvQ->
y) >= 4) ||
96 alpha = alpha_tab[av_clip_uintp2(qp_avg + h->alpha_offset, 6)]; \ 97 beta = beta_tab[av_clip_uintp2(qp_avg + h->beta_offset, 6)]; \ 98 tc = tc_tab[av_clip_uintp2(qp_avg + h->alpha_offset, 6)]; 124 for (i = 0; i < 8; i++) {
132 if (mb_type ==
I_8X8)
205 for (i = 0; i < 8; i++)
213 memset(&top[9], top[8], 9);
229 for (i = 0; i < 8; i++)
232 memcpy(&top[0], h->
cy + 7 + 7 * h->
l_stride, 9);
233 memset(&top[9], top[8], 9);
265 for (y = 0; y < 8; y++)
266 *((uint64_t *)(d + y * stride)) =
a;
273 for (y = 0; y < 8; y++) {
274 a = left[y + 1] * 0x0101010101010101ULL;
275 *((uint64_t *)(d + y * stride)) = a;
282 uint64_t
a = 0x8080808080808080ULL;
283 for (y = 0; y < 8; y++)
284 *((uint64_t *)(d + y * stride)) =
a;
294 for (x = 0; x < 4; x++) {
295 ih += (x + 1) * (top[5 + x] - top[3 - x]);
296 iv += (x + 1) * (left[5 + x] - left[3 - x]);
298 ia = (top[8] + left[8]) << 4;
299 ih = (17 * ih + 16) >> 5;
300 iv = (17 * iv + 16) >> 5;
301 for (y = 0; y < 8; y++)
302 for (x = 0; x < 8; x++)
303 d[y * stride + x] = cm[(ia + (x - 3) * ih + (y - 3) * iv + 16) >> 5];
306 #define LOWPASS(ARRAY, INDEX) \ 307 ((ARRAY[(INDEX) - 1] + 2 * ARRAY[(INDEX)] + ARRAY[(INDEX) + 1] + 2) >> 2) 312 for (y = 0; y < 8; y++)
313 for (x = 0; x < 8; x++)
314 d[y * stride + x] = (
LOWPASS(top, x + 1) +
LOWPASS(left, y + 1)) >> 1;
320 for (y = 0; y < 8; y++)
321 for (x = 0; x < 8; x++)
322 d[y * stride + x] = (
LOWPASS(top, x + y + 2) +
LOWPASS(left, x + y + 2)) >> 1;
328 for (y = 0; y < 8; y++)
329 for (x = 0; x < 8; x++)
331 d[y * stride + x] = (left[1] + 2 * top[0] + top[1] + 2) >> 2;
333 d[y * stride + x] =
LOWPASS(top, x - y);
335 d[y * stride + x] =
LOWPASS(left, y - x);
341 for (y = 0; y < 8; y++)
342 for (x = 0; x < 8; x++)
343 d[y * stride + x] =
LOWPASS(left, y + 1);
349 for (y = 0; y < 8; y++)
350 for (x = 0; x < 8; x++)
351 d[y * stride + x] =
LOWPASS(top, x + 1);
358 *mode = mod_table[*
mode];
395 int src_x_offset,
int src_y_offset,
399 const int mx = mv->
x + src_x_offset * 8;
400 const int my = mv->
y + src_y_offset * 8;
401 const int luma_xy = (mx & 3) + ((my & 3) << 2);
406 int extra_height = extra_width;
407 const int full_mx = mx >> 2;
408 const int full_my = my >> 2;
409 const int pic_width = 16 * h->
mb_width;
410 const int pic_height = 16 * h->
mb_height;
420 if (full_mx < 0 - extra_width ||
421 full_my < 0 - extra_height ||
422 full_mx + 16 > pic_width + extra_width ||
423 full_my + 16 > pic_height + extra_height) {
428 full_mx - 2, full_my - 2,
429 pic_width, pic_height);
435 qpix_op[luma_xy](dest_y, src_y, h->
l_stride);
442 pic_width >> 1, pic_height >> 1);
445 chroma_op(dest_cb, src_cb, h->
c_stride, chroma_height, mx & 7, my & 7);
452 pic_width >> 1, pic_height >> 1);
455 chroma_op(dest_cr, src_cr, h->
c_stride, chroma_height, mx & 7, my & 7);
462 int x_offset,
int y_offset,
472 dest_y += x_offset * 2 + y_offset * h->
l_stride * 2;
473 dest_cb += x_offset + y_offset * h->
c_stride;
474 dest_cr += x_offset + y_offset * h->
c_stride;
475 x_offset += 8 * h->
mbx;
476 y_offset += 8 * h->
mby;
481 dest_y, dest_cb, dest_cr, x_offset, y_offset,
482 qpix_op, chroma_op, mv);
485 chroma_op = chroma_avg;
491 dest_y, dest_cb, dest_cr, x_offset, y_offset,
543 *d_x = (src->
x * distp * den + 256 +
FF_SIGNBIT(src->
x)) >> 9;
544 *d_y = (src->
y * distp * den + 256 +
FF_SIGNBIT(src->
y)) >> 9;
553 int ax, ay, bx, by, cx, cy;
554 int len_ab, len_bc, len_ca, len_mid;
561 len_ab =
abs(ax - bx) +
abs(ay - by);
562 len_bc =
abs(bx - cx) +
abs(by - cy);
563 len_ca =
abs(cx - ax) +
abs(cy - ay);
564 len_mid =
mid_pred(len_ab, len_bc, len_ca);
565 if (len_mid == len_ab) {
568 }
else if (len_mid == len_bc) {
589 mvC = &h->
mv[nP - 5];
593 (mvA->
x | mvA->
y | mvA->
ref) == 0 ||
594 (mvB->
x | mvB->
y | mvB->
ref) == 0)) {
597 }
else if (mvA->
ref >= 0 && mvB->
ref < 0 && mvC->
ref < 0) {
599 }
else if (mvA->
ref < 0 && mvB->
ref >= 0 && mvC->
ref < 0) {
601 }
else if (mvA->
ref < 0 && mvB->
ref < 0 && mvC->
ref >= 0) {
620 if (mx != (int16_t)mx || my != (int16_t)my) {
644 for (i = 0; i < 3; i++) {
689 for (i = 0; i <= 20; i += 4)
690 h->
mv[i] = h->
mv[i + 2];
704 for (i = 0; i <= 20; i += 4)
730 for (i = 0; i <= 20; i += 4)
void ff_cavs_modify_mb_i(AVSContext *h, int *pred_mode_uv)
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
This structure describes decoded (raw) audio or video data.
uint8_t * edge_emu_buffer
static int get_se_golomb(GetBitContext *gb)
read signed exp golomb code.
static int get_bs(cavs_vector *mvP, cavs_vector *mvQ, int b)
static const int8_t left_modifier_c[7]
av_cold int ff_cavs_end(AVCodecContext *avctx)
int mbidx
macroblock coordinates
const uint8_t ff_cavs_chroma_qp[64]
h264_chroma_mc_func put_h264_chroma_pixels_tab[4]
av_cold void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx)
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
void ff_cavs_init_mb(AVSContext *h)
initialise predictors for motion vectors and intra prediction
av_cold void ff_h264chroma_init(H264ChromaContext *c, int bit_depth)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
static void intra_pred_horiz(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
uint8_t intern_border_y[26]
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...
static void intra_pred_lp_top(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
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.
void(* cavs_filter_cv)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int tc, int bs1, int bs2)
static const int8_t left_modifier_l[8]
uint8_t * top_border_y
intra prediction is done with un-deblocked samples they are saved here before deblocking the MB ...
av_cold void ff_cavsdsp_init(CAVSDSPContext *c, AVCodecContext *avctx)
cavs_vector mv[2 *4 *3]
mv motion vector cache 0: D3 B2 B3 C2 4: A1 X0 X1 - 8: A3 X2 X3 -
bitstream reader API header.
void ff_cavs_filter(AVSContext *h, enum cavs_mb mb_type)
in-loop deblocking filter for a single macroblock
int dist[2]
temporal distances from current frame to ref frames
void(* cavs_filter_ch)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int tc, int bs1, int bs2)
static void intra_pred_vert(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
static void intra_pred_plane(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
static void scale_mv(AVSContext *h, int *d_x, int *d_y, cavs_vector *src, int distp)
static void mv_pred_median(AVSContext *h, cavs_vector *mvP, cavs_vector *mvA, cavs_vector *mvB, cavs_vector *mvC)
static void intra_pred_down_left(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int scale_den[2]
for scaling neighbouring MVs
AVSFrame cur
currently decoded frame
int ff_cavs_next_mb(AVSContext *h)
save predictors for later macroblocks and increase macroblock address
void(* qpel_mc_func)(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
void ff_cavs_inter(AVSContext *h, enum cavs_mb mb_type)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
uint8_t left_border_y[26]
void(* h264_chroma_mc_func)(uint8_t *dst, uint8_t *src, ptrdiff_t srcStride, int h, int x, int y)
static const uint8_t beta_tab[64]
void ff_cavs_load_intra_pred_luma(AVSContext *h, uint8_t *top, uint8_t **left, int block)
AVSFrame DPB[2]
reference frames
static const int8_t top_modifier_c[7]
uint8_t * cv
current MB sample pointers
void ff_cavs_load_intra_pred_chroma(AVSContext *h)
qpel_mc_func put_cavs_qpel_pixels_tab[2][16]
av_cold int ff_cavs_init(AVCodecContext *avctx)
av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation, enum idct_permutation_type perm_type)
uint8_t left_border_u[10]
void(* intra_pred_c[7])(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
static const uint8_t tc_tab[64]
const uint8_t ff_cavs_partition_flags[30]
int ff_cavs_init_top_lines(AVSContext *h)
some predictions require data from the top-neighbouring macroblock.
const cavs_vector ff_cavs_dir_mv
mark block as "no prediction from this direction" e.g.
uint8_t idct_permutation[64]
IDCT input permutation.
uint8_t left_border_v[10]
void ff_cavs_mv(AVSContext *h, enum cavs_mv_loc nP, enum cavs_mv_loc nC, enum cavs_mv_pred mode, enum cavs_block size, int ref)
static void modify_pred(const int8_t *mod_table, int *mode)
static const int8_t mv[256][2]
static void intra_pred_down_right(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
static const int16_t alpha[]
main external API structure.
static void intra_pred_lp(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
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 list
static void mc_dir_part(AVSContext *h, AVFrame *pic, int chroma_height, int delta, int list, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int src_x_offset, int src_y_offset, qpel_mc_func *qpix_op, h264_chroma_mc_func chroma_op, cavs_vector *mv)
static void intra_pred_dc_128(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
int pred_mode_Y[3 *3]
luma pred mode cache 0: – B2 B3 3: A1 X0 X1 6: A3 X2 X3
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
void(* cavs_filter_lv)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int tc, int bs1, int bs2)
const uint8_t ff_zigzag_direct[64]
qpel_mc_func avg_cavs_qpel_pixels_tab[2][16]
#define LOWPASS(ARRAY, INDEX)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
GLint GLenum GLboolean GLsizei stride
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
common internal api header.
static int ref[MAX_W *MAX_W]
static void intra_pred_lp_left(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
static const int8_t top_modifier_l[8]
int flags
availability flags of neighbouring macroblocks
h264_chroma_mc_func avg_h264_chroma_pixels_tab[4]
int ff_cavs_init_pic(AVSContext *h)
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
void(* cavs_filter_lh)(uint8_t *pix, ptrdiff_t stride, int alpha, int beta, int tc, int bs1, int bs2)
static const cavs_vector un_mv
mark block as unavailable, i.e.
static void set_mvs(cavs_vector *mv, enum cavs_block size)
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(* intra_pred_l[8])(uint8_t *d, uint8_t *top, uint8_t *left, ptrdiff_t stride)
H264ChromaContext h264chroma
mode
Use these values in ebur128_init (or'ed).
static const uint8_t alpha_tab[64]
void * av_mallocz_array(size_t nmemb, size_t size)
static void mc_part_std(AVSContext *h, int chroma_height, int delta, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int x_offset, int y_offset, qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put, qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg, cavs_vector *mv)