34#include "config_components.h"
81#define QUANT_BIAS_SHIFT 8
83#define QMAT_SHIFT_MMX 16
90 int16_t *
block,
int n,
91 int qscale,
int *overflow);
103 .class_name =
"generic mpegvideo encoder",
110 uint16_t (*qmat16)[2][64],
111 const uint16_t *quant_matrix,
112 int bias,
int qmin,
int qmax,
int intra)
118 for (qscale = qmin; qscale <= qmax; qscale++) {
123 else qscale2 = qscale << 1;
130 for (
i = 0;
i < 64;
i++) {
131 const int j =
s->c.idsp.idct_permutation[
i];
139 qmat[qscale][
i] = (int)((UINT64_C(2) <<
QMAT_SHIFT) / den);
142 for (
i = 0;
i < 64;
i++) {
143 const int j =
s->c.idsp.idct_permutation[
i];
151 qmat[qscale][
i] = (int)((UINT64_C(2) << (
QMAT_SHIFT + 14)) / den);
154 for (
i = 0;
i < 64;
i++) {
155 const int j =
s->c.idsp.idct_permutation[
i];
167 qmat[qscale][
i] = (int)((UINT64_C(2) <<
QMAT_SHIFT) / den);
170 if (qmat16[qscale][0][
i] == 0 ||
171 qmat16[qscale][0][
i] == 128 * 256)
172 qmat16[qscale][0][
i] = 128 * 256 - 1;
173 qmat16[qscale][1][
i] =
175 qmat16[qscale][0][
i]);
179 for (
i = intra;
i < 64;
i++) {
184 while (((
max * qmat[qscale][
i]) >>
shift) > INT_MAX) {
191 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
200 if (
s->c.q_scale_type == 1 && 0) {
202 int bestdiff=INT_MAX;
210 if (
diff < bestdiff) {
232 for (
i = 0;
i < 64;
i++) {
244 int8_t *
const qscale_table =
s->c.cur_pic.qscale_table;
246 for (
int i = 0;
i <
s->c.mb_num;
i++) {
247 unsigned int lam =
s->lambda_table[
s->c.mb_index2xy[
i]];
249 qscale_table[
s->c.mb_index2xy[
i]] =
av_clip(qp,
s->c.avctx->qmin,
257#define COPY(a) dst->a = src->a
264 COPY(
c.frame_pred_frame_dct);
265 COPY(
c.progressive_frame);
266 COPY(partitioned_frame);
272 for (
int i = -16;
i < 16;
i++)
293 if (!
s->c.y_dc_scale_table) {
294 s->c.y_dc_scale_table =
307 if (
s->c.avctx->trellis)
350 if (!me_cmp[0] || !me_cmp[4])
352 s->ildct_cmp[0] = me_cmp[0];
353 s->ildct_cmp[1] = me_cmp[4];
358 s->sse_cmp[0] = mecc.
sse[0];
359 s->sse_cmp[1] = mecc.
sse[1];
360 s->sad_cmp[0] = mecc.
sad[0];
361 s->sad_cmp[1] = mecc.
sad[1];
363 s->n_sse_cmp[0] = mecc.
nsse[0];
364 s->n_sse_cmp[1] = mecc.
nsse[1];
366 s->n_sse_cmp[0] = mecc.
sse[0];
367 s->n_sse_cmp[1] = mecc.
sse[1];
373#define ALLOCZ_ARRAYS(p, mult, numb) ((p) = av_calloc(numb, mult * sizeof(*(p))))
378 const uint16_t *intra_matrix, *inter_matrix;
386 s->q_chroma_intra_matrix =
s->q_intra_matrix + 32;
387 s->q_chroma_intra_matrix16 =
s->q_intra_matrix16 + 32;
393 s->q_chroma_intra_matrix =
s->q_intra_matrix;
394 s->q_chroma_intra_matrix16 =
s->q_intra_matrix16;
397 s->q_inter_matrix =
s->q_intra_matrix + 32;
398 s->q_inter_matrix16 =
s->q_intra_matrix16 + 32;
419 for (
int i = 0;
i < 64;
i++) {
420 int j =
s->c.idsp.idct_permutation[
i];
422 s->c.intra_matrix[j] =
s->c.chroma_intra_matrix[j] = intra_matrix[
i];
423 s->c.inter_matrix[j] = inter_matrix[
i];
432 s->c.intra_matrix,
s->intra_quant_bias, avctx->
qmin,
434 if (
s->q_inter_matrix)
436 s->c.inter_matrix,
s->inter_quant_bias, avctx->
qmin,
446 int16_t (*mv_table)[2];
449 unsigned mb_array_size =
s->c.mb_stride *
s->c.mb_height;
450 s->mb_type =
av_calloc(mb_array_size, 3 *
sizeof(*
s->mb_type) +
sizeof(*
s->mb_mean));
453 s->mc_mb_var =
s->mb_type + mb_array_size;
454 s->mb_var =
s->mc_mb_var + mb_array_size;
455 s->mb_mean = (uint8_t*)(
s->mb_var + mb_array_size);
460 unsigned mv_table_size = (
s->c.mb_height + 2) *
s->c.mb_stride + 1;
461 unsigned nb_mv_tables = 1 + 5 * has_b_frames;
464 nb_mv_tables += 8 * has_b_frames;
465 s->p_field_select_table[0] =
av_calloc(mv_table_size, 2 * (2 + 4 * has_b_frames));
466 if (!
s->p_field_select_table[0])
468 s->p_field_select_table[1] =
s->p_field_select_table[0] + 2 * mv_table_size;
471 mv_table =
av_calloc(mv_table_size, nb_mv_tables *
sizeof(*mv_table));
475 mv_table +=
s->c.mb_stride + 1;
477 s->p_mv_table = mv_table;
479 s->b_forw_mv_table = mv_table += mv_table_size;
480 s->b_back_mv_table = mv_table += mv_table_size;
481 s->b_bidir_forw_mv_table = mv_table += mv_table_size;
482 s->b_bidir_back_mv_table = mv_table += mv_table_size;
483 s->b_direct_mv_table = mv_table += mv_table_size;
485 if (
s->p_field_select_table[1]) {
486 uint8_t *field_select =
s->p_field_select_table[1];
487 for (
int j = 0; j < 2; j++) {
488 for (
int k = 0; k < 2; k++) {
489 for (
int l = 0; l < 2; l++)
490 s->b_field_mv_table[j][k][l] = mv_table += mv_table_size;
491 s->b_field_select_table[j][k] = field_select += 2 * mv_table_size;
511 DCT_ERROR_SIZE =
FFALIGN(2 *
sizeof(*
s->dct_error_sum),
ALIGN),
514 "Need checks for potential overflow.");
515 unsigned nb_slices =
s->c.slice_context_count;
528 const int y_size =
s->c.b8_stride * (2 *
s->c.mb_height + 1);
529 const int c_size =
s->c.mb_stride * (
s->c.mb_height + 1);
530 const int yc_size = y_size + 2 * c_size;
533 for (
unsigned i = 0;
i < nb_slices; ++
i) {
536 s2->
block = s2->blocks[0];
583 s->c.width = avctx->
width;
588 "keyframe interval too large!, reducing it from %d to %d\n",
600 "max b frames must be 0 or positive for mpegvideo based encoders\n");
611 s->rtp_mode = !!
s->rtp_payload_size;
662 av_log(avctx,
AV_LOG_ERROR,
"Either both buffer size and max rate or neither must be specified\n");
668 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
685 "impossible bitrate constraints, this will fail\n");
701 if (nbt <= INT_MAX) {
716 "OBMC is only supported with simple mb decision\n");
731 "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
739 (avctx->
width > 2048 ||
745 (avctx->
width > 65535 ||
746 avctx->
height > 65535 )) {
753 ((avctx->
width &3) ||
786 "closed gop with scene change detection are not supported yet, "
787 "set threshold to 1000000000\n");
795 "low delay forcing is only available for mpeg2, "
796 "set strict_std_compliance to 'unofficial' or lower in order to allow it\n");
801 "B-frames cannot be used with low delay\n");
814 "notice: b_frame_strategy only affects the first pass\n");
829 s->inter_quant_bias = 0;
831 s->intra_quant_bias = 0;
837 av_log(avctx,
AV_LOG_ERROR,
"qmin and or qmax are invalid, they must be 0 < min <= max\n");
841 av_log(avctx,
AV_LOG_DEBUG,
"intra_quant_bias = %d inter_quant_bias = %d\n",
s->intra_quant_bias,
s->inter_quant_bias);
844#if CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER
854#if CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER
862 s->c.y_dc_scale_table =
880 if (!CONFIG_H263_ENCODER)
883 s->c.width,
s->c.height) == 8) {
885 "The specified picture size of %dx%d is not valid for "
886 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
887 "352x288, 704x576, and 1408x1152. "
888 "Try H.263+.\n",
s->c.width,
s->c.height);
899 s->modified_quant =
s->c.h263_aic;
901 s->me.unrestricted_mv =
s->c.obmc ||
s->loop_filter ||
s->umvplus;
902 s->flipflop_rounding = 1;
911 s->me.unrestricted_mv = 1;
916#if CONFIG_RV10_ENCODER
923#if CONFIG_RV20_ENCODER
929 s->modified_quant = 1;
934 s->me.unrestricted_mv = 0;
940 s->me.unrestricted_mv = 1;
941 s->flipflop_rounding = 1;
948 s->me.unrestricted_mv = 1;
949 s->c.msmpeg4_version = MSMP4_V2;
956 s->me.unrestricted_mv = 1;
957 s->c.msmpeg4_version = MSMP4_V3;
958 s->flipflop_rounding = 1;
965 s->me.unrestricted_mv = 1;
966 s->c.msmpeg4_version = MSMP4_WMV1;
967 s->flipflop_rounding = 1;
974 s->me.unrestricted_mv = 1;
975 s->c.msmpeg4_version = MSMP4_WMV2;
976 s->flipflop_rounding = 1;
981 av_unreachable(
"List contains all codecs using ff_mpv_encode_init()");
988 s->c.progressive_frame =
991 s->c.alternate_scan);
1002 s->frame_reconstruction_bitfield = 0;
1034 if (CONFIG_H263_ENCODER &&
s->c.out_format ==
FMT_H263) {
1036#if CONFIG_MSMPEG4ENC
1037 if (
s->c.msmpeg4_version != MSMP4_UNUSED)
1042 s->c.slice_ctx_size =
sizeof(*s);
1049 if (
s->c.slice_context_count > 1) {
1052 s->h263_slice_structured = 1;
1130 int16_t *
block,
int i, uint8_t *dest,
int line_size,
int qscale)
1132 s->c.dct_unquantize_intra(&
s->c,
block,
i, qscale);
1133 s->c.idsp.idct_put(dest, line_size,
block);
1137 int16_t *
block,
int i, uint8_t *dest,
int line_size,
int qscale)
1139 if (
s->c.block_last_index[
i] >= 0) {
1140 s->c.dct_unquantize_inter(&
s->c,
block,
i, qscale);
1142 s->c.idsp.idct_add(dest, line_size,
block);
1154 for (
int i = 0;
i < 6;
i++) {
1155 for (
int j = 0; j < 64; j++) {
1157 block[
i][
s->c.idsp.idct_permutation[j]]);
1163 if ((1 <<
s->c.pict_type) &
s->frame_reconstruction_bitfield) {
1164 uint8_t *dest_y =
s->c.dest[0], *dest_cb =
s->c.dest[1], *dest_cr =
s->c.dest[2];
1165 int dct_linesize, dct_offset;
1166 const int linesize =
s->c.cur_pic.linesize[0];
1167 const int uvlinesize =
s->c.cur_pic.linesize[1];
1168 const int block_size = 8;
1170 dct_linesize = linesize <<
s->c.interlaced_dct;
1171 dct_offset =
s->c.interlaced_dct ? linesize : linesize * block_size;
1173 if (!
s->c.mb_intra) {
1181 if (
s->c.chroma_y_shift) {
1196 put_dct(
s,
block[1], 1, dest_y + block_size, dct_linesize,
s->c.qscale);
1197 put_dct(
s,
block[2], 2, dest_y + dct_offset , dct_linesize,
s->c.qscale);
1198 put_dct(
s,
block[3], 3, dest_y + dct_offset + block_size, dct_linesize,
s->c.qscale);
1201 if (
s->c.chroma_y_shift) {
1202 put_dct(
s,
block[4], 4, dest_cb, uvlinesize,
s->c.chroma_qscale);
1203 put_dct(
s,
block[5], 5, dest_cr, uvlinesize,
s->c.chroma_qscale);
1207 put_dct(
s,
block[4], 4, dest_cb, dct_linesize,
s->c.chroma_qscale);
1208 put_dct(
s,
block[5], 5, dest_cr, dct_linesize,
s->c.chroma_qscale);
1209 put_dct(
s,
block[6], 6, dest_cb + dct_offset, dct_linesize,
s->c.chroma_qscale);
1210 put_dct(
s,
block[7], 7, dest_cr + dct_offset, dct_linesize,
s->c.chroma_qscale);
1222 for (y = 0; y < 16; y++) {
1223 for (x = 0; x < 16; x++) {
1237 w =
s->c.width & ~15;
1238 h =
s->c.height & ~15;
1240 for (y = 0; y <
h; y += 16) {
1241 for (x = 0; x <
w; x += 16) {
1248 acc += sae + 500 < sad;
1274 for (
int i = 0;
f->data[
i];
i++) {
1295 int display_picture_number = 0, ret;
1297 : (
s->c.low_delay ? 0 : 1);
1298 int flush_offset = 1;
1309 (
pts > INT64_MAX / 2 /
s->c.avctx->time_base.num ||
1320 "Invalid pts (%"PRId64
") <= last (%"PRId64
")\n",
1325 if (!
s->c.low_delay && display_picture_number == 1)
1334 "Warning: AVFrame.pts=? trying to guess (%"PRId64
")\n",
1337 pts = display_picture_number;
1341 if (pic_arg->
linesize[0] !=
s->c.linesize ||
1342 pic_arg->
linesize[1] !=
s->c.uvlinesize ||
1343 pic_arg->
linesize[2] !=
s->c.uvlinesize)
1345 if ((
s->c.width & 15) || (
s->c.height & 15))
1353 pic_arg->
linesize[1],
s->c.linesize,
s->c.uvlinesize);
1368 for (
int i = 0;
i < 3;
i++) {
1369 ptrdiff_t src_stride = pic_arg->
linesize[
i];
1370 ptrdiff_t dst_stride =
i ?
s->c.uvlinesize :
s->c.linesize;
1371 int h_shift =
i ?
s->c.chroma_x_shift : 0;
1372 int v_shift =
i ?
s->c.chroma_y_shift : 0;
1375 const uint8_t *
src = pic_arg->
data[
i];
1379 && !
s->c.progressive_sequence
1380 &&
FFALIGN(
s->c.height, 32) -
s->c.height > 16)
1383 if (!
s->c.avctx->rc_buffer_size)
1387 if (src_stride == dst_stride)
1388 memcpy(
dst,
src, src_stride *
h - src_stride +
w);
1391 uint8_t *dst2 =
dst;
1393 memcpy(dst2,
src,
w);
1398 if ((
s->c.width & 15) || (
s->c.height & (vpad-1))) {
1399 s->mpvencdsp.draw_edges(
dst, dst_stride,
1416 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1420 encoding_delay -= flush_offset - 1;
1444 for (
int plane = 0; plane < 3; plane++) {
1445 const int stride = p->f->linesize[plane];
1446 const int bw = plane ? 1 : 2;
1447 for (
int y = 0; y <
s->c.mb_height * bw; y++) {
1448 for (
int x = 0; x <
s->c.mb_width * bw; x++) {
1449 const uint8_t *dptr = p->f->data[plane] + 8 * (x + y *
stride);
1450 const uint8_t *rptr =
ref->f->data[plane] + 8 * (x + y *
stride);
1454 case 0: score =
FFMAX(score, v);
break;
1455 case 1: score +=
FFABS(v);
break;
1456 case 2: score64 += v * (
int64_t)v;
break;
1468 score64 = pow(score64 / (
double)(
s->c.mb_width *
s->c.mb_height),
1471 if (score64 < m->frame_skip_threshold)
1506 int out_size, p_lambda, b_lambda, lambda2;
1508 int best_b_count = -1;
1521 b_lambda = p_lambda;
1529 if (pre_input_ptr) {
1530 const AVFrame *
const pre_input = pre_input_ptr->
f;
1567 c->mb_decision =
s->c.avctx->mb_decision;
1568 c->me_cmp =
s->c.avctx->me_cmp;
1569 c->mb_cmp =
s->c.avctx->mb_cmp;
1570 c->me_sub_cmp =
s->c.avctx->me_sub_cmp;
1572 c->time_base =
s->c.avctx->time_base;
1615 rd +=
c->error[0] +
c->error[1] +
c->error[2];
1633 return best_b_count;
1655 s->c.next_pic.ptr &&
1707 for (
int i = 0;;
i++) {
1712 b_frames =
FFMAX(0,
i - 1);
1718 for (
int i = 0;
i < b_frames + 1;
i++)
1731 s->c.last_non_b_time > UINT16_MAX)
1734 for (
int i = b_frames - 1;
i >= 0;
i--) {
1742 "warning, too many B-frames in a row\n");
1766 for (
int i = 0;
i < b_frames;
i++) {
1822 av_assert1(
s->c.mb_width ==
s->c.buffer_pools.alloc_mb_width);
1823 av_assert1(
s->c.mb_height ==
s->c.buffer_pools.alloc_mb_height);
1824 av_assert1(
s->c.mb_stride ==
s->c.buffer_pools.alloc_mb_stride);
1826 &
s->c.sc, &
s->c.buffer_pools,
s->c.mb_height);
1831 s->picture_number =
s->c.cur_pic.ptr->display_picture_number;
1844 if (
s->me.unrestricted_mv &&
1845 s->c.cur_pic.reference &&
1847 int hshift =
s->c.chroma_x_shift;
1848 int vshift =
s->c.chroma_y_shift;
1849 s->mpvencdsp.draw_edges(
s->c.cur_pic.data[0],
1850 s->c.cur_pic.linesize[0],
1851 s->c.h_edge_pos,
s->c.v_edge_pos,
1854 s->mpvencdsp.draw_edges(
s->c.cur_pic.data[1],
1855 s->c.cur_pic.linesize[1],
1856 s->c.h_edge_pos >> hshift,
1857 s->c.v_edge_pos >> vshift,
1861 s->mpvencdsp.draw_edges(
s->c.cur_pic.data[2],
1862 s->c.cur_pic.linesize[2],
1863 s->c.h_edge_pos >> hshift,
1864 s->c.v_edge_pos >> vshift,
1881 for (intra = 0; intra < 2; intra++) {
1882 if (
s->dct_count[intra] > (1 << 16)) {
1883 for (
i = 0;
i < 64;
i++) {
1884 s->dct_error_sum[intra][
i] >>= 1;
1886 s->dct_count[intra] >>= 1;
1889 for (
i = 0;
i < 64;
i++) {
1891 s->dct_count[intra] +
1892 s->dct_error_sum[intra][
i] / 2) /
1893 (
s->dct_error_sum[intra][
i] + 1);
1902 s->c.cur_pic.ptr->f->pict_type =
s->c.pict_type;
1910 if (
s->dct_error_sum) {
1916 const AVFrame *pic_arg,
int *got_packet)
1920 int stuffing_count, ret;
1921 int context_count =
s->c.slice_context_count;
1938 if (
s->new_pic->data[0]) {
1939 int growing_buffer = context_count == 1 && !
s->data_partitioning;
1940 size_t pkt_size = 10000 +
s->c.mb_width *
s->c.mb_height *
1956 s->c.mb_width*
s->c.mb_height*12);
1957 if (!
s->mb_info_ptr)
1959 s->prev_mb_info =
s->last_mb_info =
s->mb_info_size = 0;
1962 s->c.pict_type =
s->new_pic->pict_type;
1966 if (growing_buffer) {
1968 pkt->data =
s->pb.buf;
1976 if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) &&
s->c.out_format ==
FMT_MJPEG)
1986 s->lambda < m->
lmax) {
1988 (
s->c.qscale + 1) /
s->c.qscale);
1989 if (
s->adaptive_quant) {
1990 for (
int i = 0;
i <
s->c.mb_height *
s->c.mb_stride;
i++)
1991 s->lambda_table[
i] =
1992 FFMAX(
s->lambda_table[
i] + min_step,
1993 s->lambda_table[
i] * (
s->c.qscale + 1) /
1996 s->c.mb_skipped = 0;
1999 s->c.no_rounding ^=
s->flipflop_rounding;
2002 s->c.time_base =
s->c.last_time_base;
2003 s->c.last_non_b_time =
s->c.time -
s->c.pp_time;
2017 avctx->
error[
i] +=
s->encoding_error[
i];
2025 s->misc_bits +
s->i_tex_bits +
2032 if (stuffing_count) {
2038 switch (
s->c.codec_id) {
2041 while (stuffing_count--) {
2048 stuffing_count -= 4;
2049 while (stuffing_count--) {
2070 int vbv_delay, min_delay;
2080 "Internal error, negative bits\n");
2085 min_delay = (minbits * 90000LL + avctx->
rc_max_rate - 1) /
2088 vbv_delay =
FFMAX(vbv_delay, min_delay);
2092 vbv_delay_ptr[0] &= 0xF8;
2093 vbv_delay_ptr[0] |= vbv_delay >> 13;
2094 vbv_delay_ptr[1] = vbv_delay >> 5;
2095 vbv_delay_ptr[2] &= 0x07;
2096 vbv_delay_ptr[2] |= vbv_delay << 3;
2104 (uint8_t*)props, props_size);
2112 pkt->pts =
s->c.cur_pic.ptr->f->pts;
2113 pkt->duration =
s->c.cur_pic.ptr->f->duration;
2115 if (!
s->c.cur_pic.ptr->coded_picture_number)
2143 *got_packet = !!
pkt->size;
2148 int n,
int threshold)
2150 static const char tab[64] = {
2151 3, 2, 2, 1, 1, 1, 1, 1,
2152 1, 1, 1, 1, 1, 1, 1, 1,
2153 1, 1, 1, 1, 1, 1, 1, 1,
2154 0, 0, 0, 0, 0, 0, 0, 0,
2155 0, 0, 0, 0, 0, 0, 0, 0,
2156 0, 0, 0, 0, 0, 0, 0, 0,
2157 0, 0, 0, 0, 0, 0, 0, 0,
2158 0, 0, 0, 0, 0, 0, 0, 0
2163 int16_t *
block =
s->block[n];
2164 const int last_index =
s->c.block_last_index[n];
2167 if (threshold < 0) {
2169 threshold = -threshold;
2174 if (last_index <= skip_dc - 1)
2177 for (
i = 0;
i <= last_index;
i++) {
2178 const int j =
s->c.intra_scantable.permutated[
i];
2181 if (skip_dc &&
i == 0)
2185 }
else if (
level > 1) {
2191 if (score >= threshold)
2193 for (
i = skip_dc;
i <= last_index;
i++) {
2194 const int j =
s->c.intra_scantable.permutated[
i];
2198 s->c.block_last_index[n] = 0;
2200 s->c.block_last_index[n] = -1;
2207 const int maxlevel =
s->max_qcoeff;
2208 const int minlevel =
s->min_qcoeff;
2211 if (
s->c.mb_intra) {
2216 for (;
i <= last_index;
i++) {
2217 const int j =
s->c.intra_scantable.permutated[
i];
2220 if (
level > maxlevel) {
2223 }
else if (
level < minlevel) {
2233 "warning, clipping %d dct coefficients to %d..%d\n",
2234 overflow, minlevel, maxlevel);
2241 for (y = 0; y < 8; y++) {
2242 for (x = 0; x < 8; x++) {
2248 for (y2 =
FFMAX(y - 1, 0); y2 <
FFMIN(8, y + 2); y2++) {
2249 for (x2=
FFMAX(x - 1, 0); x2 <
FFMIN(8, x + 2); x2++) {
2250 int v = ptr[x2 + y2 *
stride];
2262 int motion_x,
int motion_y,
2263 int mb_block_height,
2272#define INTERLACED_DCT(s) ((chroma_format == CHROMA_420 || chroma_format == CHROMA_422) && \
2273 (s)->c.avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT)
2275 int16_t orig[12][64];
2276 const int mb_x =
s->c.mb_x;
2277 const int mb_y =
s->c.mb_y;
2280 int dct_offset =
s->c.linesize * 8;
2281 int uv_dct_offset =
s->c.uvlinesize * 8;
2282 const uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2283 ptrdiff_t wrap_y, wrap_c;
2285 for (
i = 0;
i < mb_block_count;
i++)
2286 skip_dct[
i] =
s->skipdct;
2288 if (
s->adaptive_quant) {
2289 const int last_qp =
s->c.qscale;
2290 const int mb_xy = mb_x + mb_y *
s->c.mb_stride;
2292 s->lambda =
s->lambda_table[mb_xy];
2297 s->dquant =
s->c.cur_pic.qscale_table[mb_xy] - last_qp;
2303 if (!
s->c.mb_intra) {
2318 wrap_y =
s->c.linesize;
2319 wrap_c =
s->c.uvlinesize;
2320 ptr_y =
s->new_pic->data[0] +
2321 (mb_y * 16 * wrap_y) + mb_x * 16;
2322 ptr_cb =
s->new_pic->data[1] +
2323 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2324 ptr_cr =
s->new_pic->data[2] +
2325 (mb_y * mb_block_height * wrap_c) + mb_x * mb_block_width;
2327 if ((mb_x * 16 + 16 >
s->c.width || mb_y * 16 + 16 >
s->c.height) &&
2329 uint8_t *ebuf =
s->c.sc.edge_emu_buffer + 38 * wrap_y;
2330 int cw = (
s->c.width + chroma_x_shift) >> chroma_x_shift;
2331 int ch = (
s->c.height + chroma_y_shift) >> chroma_y_shift;
2332 s->c.vdsp.emulated_edge_mc(ebuf, ptr_y,
2334 16, 16, mb_x * 16, mb_y * 16,
2335 s->c.width,
s->c.height);
2337 s->c.vdsp.emulated_edge_mc(ebuf + 16 * wrap_y, ptr_cb,
2339 mb_block_width, mb_block_height,
2340 mb_x * mb_block_width, mb_y * mb_block_height,
2342 ptr_cb = ebuf + 16 * wrap_y;
2343 s->c.vdsp.emulated_edge_mc(ebuf + 16 * wrap_y + 16, ptr_cr,
2345 mb_block_width, mb_block_height,
2346 mb_x * mb_block_width, mb_y * mb_block_height,
2348 ptr_cr = ebuf + 16 * wrap_y + 16;
2351 if (
s->c.mb_intra) {
2353 int progressive_score, interlaced_score;
2355 s->c.interlaced_dct = 0;
2356 progressive_score =
s->ildct_cmp[1](
s, ptr_y,
NULL, wrap_y, 8) +
2357 s->ildct_cmp[1](
s, ptr_y + wrap_y * 8,
2358 NULL, wrap_y, 8) - 400;
2360 if (progressive_score > 0) {
2361 interlaced_score =
s->ildct_cmp[1](
s, ptr_y,
2362 NULL, wrap_y * 2, 8) +
2363 s->ildct_cmp[1](
s, ptr_y + wrap_y,
2364 NULL, wrap_y * 2, 8);
2365 if (progressive_score > interlaced_score) {
2366 s->c.interlaced_dct = 1;
2368 dct_offset = wrap_y;
2369 uv_dct_offset = wrap_c;
2378 s->pdsp.get_pixels(
s->block[0], ptr_y, wrap_y);
2379 s->pdsp.get_pixels(
s->block[1], ptr_y + 8, wrap_y);
2380 s->pdsp.get_pixels(
s->block[2], ptr_y + dct_offset, wrap_y);
2381 s->pdsp.get_pixels(
s->block[3], ptr_y + dct_offset + 8, wrap_y);
2387 s->pdsp.get_pixels(
s->block[4], ptr_cb, wrap_c);
2388 s->pdsp.get_pixels(
s->block[5], ptr_cr, wrap_c);
2390 s->pdsp.get_pixels(
s->block[6], ptr_cb + uv_dct_offset, wrap_c);
2391 s->pdsp.get_pixels(
s->block[7], ptr_cr + uv_dct_offset, wrap_c);
2393 s->pdsp.get_pixels(
s->block[ 6], ptr_cb + 8, wrap_c);
2394 s->pdsp.get_pixels(
s->block[ 7], ptr_cr + 8, wrap_c);
2395 s->pdsp.get_pixels(
s->block[ 8], ptr_cb + uv_dct_offset, wrap_c);
2396 s->pdsp.get_pixels(
s->block[ 9], ptr_cr + uv_dct_offset, wrap_c);
2397 s->pdsp.get_pixels(
s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
2398 s->pdsp.get_pixels(
s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
2404 uint8_t *dest_y, *dest_cb, *dest_cr;
2406 dest_y =
s->c.dest[0];
2407 dest_cb =
s->c.dest[1];
2408 dest_cr =
s->c.dest[2];
2411 op_pix =
s->c.hdsp.put_pixels_tab;
2412 op_qpix =
s->c.qdsp.put_qpel_pixels_tab;
2414 op_pix =
s->c.hdsp.put_no_rnd_pixels_tab;
2415 op_qpix =
s->c.qdsp.put_no_rnd_qpel_pixels_tab;
2422 op_pix =
s->c.hdsp.avg_pixels_tab;
2423 op_qpix =
s->c.qdsp.avg_qpel_pixels_tab;
2432 int progressive_score, interlaced_score;
2434 s->c.interlaced_dct = 0;
2435 progressive_score =
s->ildct_cmp[0](
s, dest_y, ptr_y, wrap_y, 8) +
2436 s->ildct_cmp[0](
s, dest_y + wrap_y * 8,
2441 progressive_score -= 400;
2443 if (progressive_score > 0) {
2444 interlaced_score =
s->ildct_cmp[0](
s, dest_y, ptr_y,
2446 s->ildct_cmp[0](
s, dest_y + wrap_y,
2450 if (progressive_score > interlaced_score) {
2451 s->c.interlaced_dct = 1;
2453 dct_offset = wrap_y;
2454 uv_dct_offset = wrap_c;
2462 s->pdsp.diff_pixels(
s->block[0], ptr_y, dest_y, wrap_y);
2463 s->pdsp.diff_pixels(
s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2464 s->pdsp.diff_pixels(
s->block[2], ptr_y + dct_offset,
2465 dest_y + dct_offset, wrap_y);
2466 s->pdsp.diff_pixels(
s->block[3], ptr_y + dct_offset + 8,
2467 dest_y + dct_offset + 8, wrap_y);
2473 s->pdsp.diff_pixels(
s->block[4], ptr_cb, dest_cb, wrap_c);
2474 s->pdsp.diff_pixels(
s->block[5], ptr_cr, dest_cr, wrap_c);
2475 if (!chroma_y_shift) {
2476 s->pdsp.diff_pixels(
s->block[6], ptr_cb + uv_dct_offset,
2477 dest_cb + uv_dct_offset, wrap_c);
2478 s->pdsp.diff_pixels(
s->block[7], ptr_cr + uv_dct_offset,
2479 dest_cr + uv_dct_offset, wrap_c);
2483 if (
s->mc_mb_var[
s->c.mb_stride * mb_y + mb_x] < 2 *
s->c.qscale *
s->c.qscale) {
2485 if (
s->sad_cmp[1](
NULL, ptr_y, dest_y, wrap_y, 8) < 20 *
s->c.qscale)
2487 if (
s->sad_cmp[1](
NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 *
s->c.qscale)
2489 if (
s->sad_cmp[1](
NULL, ptr_y + dct_offset, dest_y + dct_offset,
2490 wrap_y, 8) < 20 *
s->c.qscale)
2492 if (
s->sad_cmp[1](
NULL, ptr_y + dct_offset + 8, dest_y + dct_offset + 8,
2493 wrap_y, 8) < 20 *
s->c.qscale)
2495 if (
s->sad_cmp[1](
NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 *
s->c.qscale)
2497 if (
s->sad_cmp[1](
NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 *
s->c.qscale)
2499 if (!chroma_y_shift) {
2500 if (
s->sad_cmp[1](
NULL, ptr_cb + uv_dct_offset,
2501 dest_cb + uv_dct_offset,
2502 wrap_c, 8) < 20 *
s->c.qscale)
2504 if (
s->sad_cmp[1](
NULL, ptr_cr + uv_dct_offset,
2505 dest_cr + uv_dct_offset,
2506 wrap_c, 8) < 20 *
s->c.qscale)
2512 if (
s->quantizer_noise_shaping) {
2525 if (!chroma_y_shift) {
2533 memcpy(orig[0],
s->block[0],
sizeof(int16_t) * 64 * mb_block_count);
2539 for (
i = 0;
i < mb_block_count;
i++) {
2542 s->c.block_last_index[
i] =
s->dct_quantize(
s,
s->block[
i],
i,
s->c.qscale, &overflow);
2551 s->c.block_last_index[
i] = -1;
2553 if (
s->quantizer_noise_shaping) {
2554 for (
i = 0;
i < mb_block_count;
i++) {
2556 s->c.block_last_index[
i] =
2558 orig[
i],
i,
s->c.qscale);
2563 if (
s->luma_elim_threshold && !
s->c.mb_intra)
2564 for (
i = 0;
i < 4;
i++)
2566 if (
s->chroma_elim_threshold && !
s->c.mb_intra)
2567 for (
i = 4;
i < mb_block_count;
i++)
2571 for (
i = 0;
i < mb_block_count;
i++) {
2572 if (
s->c.block_last_index[
i] == -1)
2573 s->coded_score[
i] = INT_MAX / 256;
2579 s->c.block_last_index[4] =
2580 s->c.block_last_index[5] = 0;
2582 s->block[5][0] = (1024 +
s->c.c_dc_scale / 2) /
s->c.c_dc_scale;
2583 if (!chroma_y_shift) {
2584 for (
i=6;
i<12;
i++) {
2585 s->c.block_last_index[
i] = 0;
2586 s->block[
i][0] =
s->block[4][0];
2593 for (
i = 0;
i < mb_block_count;
i++) {
2595 if (
s->c.block_last_index[
i] > 0) {
2596 for (j = 63; j > 0; j--) {
2597 if (
s->block[
i][
s->c.intra_scantable.permutated[j]])
2600 s->c.block_last_index[
i] = j;
2605 s->encode_mb(
s,
s->block, motion_x, motion_y);
2637#define COPY_CONTEXT(BEFORE, AFTER, DST_TYPE, SRC_TYPE) \
2638static inline void BEFORE ##_context_before_encode(DST_TYPE *const d, \
2639 const SRC_TYPE *const s) \
2642 memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \
2645 d->mb_skip_run = s->mb_skip_run; \
2646 for (int i = 0; i < 3; i++) \
2647 d->last_dc[i] = s->last_dc[i]; \
2650 d->mv_bits = s->mv_bits; \
2651 d->i_tex_bits = s->i_tex_bits; \
2652 d->p_tex_bits = s->p_tex_bits; \
2653 d->i_count = s->i_count; \
2654 d->misc_bits = s->misc_bits; \
2657 d->c.mb_skipped = 0; \
2658 d->c.qscale = s->c.qscale; \
2659 d->dquant = s->dquant; \
2661 d->esc3_level_length = s->esc3_level_length; \
2664static inline void AFTER ## _context_after_encode(DST_TYPE *const d, \
2665 const SRC_TYPE *const s, \
2666 int data_partitioning) \
2669 memcpy(d->c.mv, s->c.mv, 2*4*2*sizeof(int)); \
2670 memcpy(d->c.last_mv, s->c.last_mv, 2*2*2*sizeof(int)); \
2673 d->mb_skip_run = s->mb_skip_run; \
2674 for (int i = 0; i < 3; i++) \
2675 d->last_dc[i] = s->last_dc[i]; \
2678 d->mv_bits = s->mv_bits; \
2679 d->i_tex_bits = s->i_tex_bits; \
2680 d->p_tex_bits = s->p_tex_bits; \
2681 d->i_count = s->i_count; \
2682 d->misc_bits = s->misc_bits; \
2684 d->c.mb_intra = s->c.mb_intra; \
2685 d->c.mb_skipped = s->c.mb_skipped; \
2686 d->c.mv_type = s->c.mv_type; \
2687 d->c.mv_dir = s->c.mv_dir; \
2689 if (data_partitioning) { \
2691 d->tex_pb = s->tex_pb; \
2693 d->block = s->block; \
2694 for (int i = 0; i < 8; i++) \
2695 d->c.block_last_index[i] = s->c.block_last_index[i]; \
2696 d->c.interlaced_dct = s->c.interlaced_dct; \
2697 d->c.qscale = s->c.qscale; \
2699 d->esc3_level_length = s->esc3_level_length; \
2707 int *dmin,
int *next_block,
int motion_x,
int motion_y)
2710 uint8_t *dest_backup[3];
2712 reset_context_before_encode(
s, backup);
2714 s->block =
s->blocks[*next_block];
2715 s->pb = pb[*next_block];
2716 if (
s->data_partitioning) {
2717 s->pb2 = pb2 [*next_block];
2718 s->tex_pb= tex_pb[*next_block];
2722 memcpy(dest_backup,
s->c.dest,
sizeof(
s->c.dest));
2723 s->c.dest[0] =
s->c.sc.rd_scratchpad;
2724 s->c.dest[1] =
s->c.sc.rd_scratchpad + 16*
s->c.linesize;
2725 s->c.dest[2] =
s->c.sc.rd_scratchpad + 16*
s->c.linesize + 8;
2732 if (
s->data_partitioning) {
2740 score *=
s->lambda2;
2745 memcpy(
s->c.dest, dest_backup,
sizeof(
s->c.dest));
2752 save_context_after_encode(best,
s,
s->data_partitioning);
2764 else if(
w==8 &&
h==8)
2782 int chroma_mb_w =
w >>
s->c.chroma_x_shift;
2783 int chroma_mb_h =
h >>
s->c.chroma_y_shift;
2785 if (
s->c.mb_x*16 + 16 >
s->c.width )
w =
s->c.width -
s->c.mb_x*16;
2786 if (
s->c.mb_y*16 + 16 >
s->c.height)
h =
s->c.height-
s->c.mb_y*16;
2789 return s->n_sse_cmp[0](
s,
s->new_pic->data[0] +
s->c.mb_x * 16 +
s->c.mb_y *
s->c.linesize * 16,
2790 s->c.dest[0],
s->c.linesize, 16) +
2791 s->n_sse_cmp[1](
s,
s->new_pic->data[1] +
s->c.mb_x * chroma_mb_w +
s->c.mb_y *
s->c.uvlinesize * chroma_mb_h,
2792 s->c.dest[1],
s->c.uvlinesize, chroma_mb_h) +
2793 s->n_sse_cmp[1](
s,
s->new_pic->data[2] +
s->c.mb_x * chroma_mb_w +
s->c.mb_y *
s->c.uvlinesize * chroma_mb_h,
2794 s->c.dest[2],
s->c.uvlinesize, chroma_mb_h);
2796 return sse(
s,
s->new_pic->data[0] +
s->c.mb_x * 16 +
s->c.mb_y *
s->c.linesize * 16,
2797 s->c.dest[0],
w,
h,
s->c.linesize) +
2798 sse(
s,
s->new_pic->data[1] +
s->c.mb_x * chroma_mb_w +
s->c.mb_y *
s->c.uvlinesize * chroma_mb_h,
2799 s->c.dest[1],
w >>
s->c.chroma_x_shift,
h >>
s->c.chroma_y_shift,
s->c.uvlinesize) +
2800 sse(
s,
s->new_pic->data[2] +
s->c.mb_x * chroma_mb_w +
s->c.mb_y *
s->c.uvlinesize * chroma_mb_h,
2801 s->c.dest[2],
w >>
s->c.chroma_x_shift,
h >>
s->c.chroma_y_shift,
s->c.uvlinesize);
2809 s->me.dia_size =
s->c.avctx->pre_dia_size;
2810 s->c.first_slice_line = 1;
2811 for (
s->c.mb_y =
s->c.end_mb_y - 1;
s->c.mb_y >=
s->c.start_mb_y;
s->c.mb_y--) {
2812 for (
s->c.mb_x =
s->c.mb_width - 1;
s->c.mb_x >=0 ;
s->c.mb_x--)
2814 s->c.first_slice_line = 0;
2825 s->me.dia_size =
s->c.avctx->dia_size;
2826 s->c.first_slice_line = 1;
2827 for (
s->c.mb_y =
s->c.start_mb_y;
s->c.mb_y <
s->c.end_mb_y;
s->c.mb_y++) {
2830 for (
s->c.mb_x = 0;
s->c.mb_x <
s->c.mb_width;
s->c.mb_x++) {
2831 s->c.block_index[0] += 2;
2832 s->c.block_index[1] += 2;
2833 s->c.block_index[2] += 2;
2834 s->c.block_index[3] += 2;
2842 s->c.first_slice_line = 0;
2850 for (
int mb_y =
s->c.start_mb_y; mb_y < s->
c.end_mb_y; mb_y++) {
2851 for (
int mb_x = 0; mb_x <
s->c.mb_width; mb_x++) {
2854 const uint8_t *
pix =
s->new_pic->data[0] + (yy *
s->c.linesize) + xx;
2856 int sum =
s->mpvencdsp.pix_sum(
pix,
s->c.linesize);
2858 varc = (
s->mpvencdsp.pix_norm1(
pix,
s->c.linesize) -
2859 (((
unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2861 s->mb_var [
s->c.mb_stride * mb_y + mb_x] = varc;
2862 s->mb_mean[
s->c.mb_stride * mb_y + mb_x] = (sum+128)>>8;
2863 s->me.mb_var_sum_temp += varc;
2872 if (
s->partitioned_frame)
2876 }
else if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) &&
2879 }
else if (CONFIG_SPEEDHQ_ENCODER &&
s->c.out_format ==
FMT_SPEEDHQ) {
2891 uint8_t *ptr =
s->mb_info_ptr +
s->mb_info_size - 12;
2893 int mba =
s->c.mb_x +
s->c.mb_width * (
s->c.mb_y %
s->gob_index);
2894 int gobn =
s->c.mb_y /
s->gob_index;
2896 if (CONFIG_H263_ENCODER)
2898 bytestream_put_le32(&ptr,
offset);
2899 bytestream_put_byte(&ptr,
s->c.qscale);
2900 bytestream_put_byte(&ptr, gobn);
2901 bytestream_put_le16(&ptr, mba);
2902 bytestream_put_byte(&ptr, pred_x);
2903 bytestream_put_byte(&ptr, pred_y);
2905 bytestream_put_byte(&ptr, 0);
2906 bytestream_put_byte(&ptr, 0);
2914 s->mb_info_size += 12;
2915 s->prev_mb_info =
s->last_mb_info;
2919 if (!
s->mb_info_size)
2920 s->mb_info_size += 12;
2927 &&
s->c.slice_context_count == 1
2928 &&
s->pb.buf ==
s->c.avctx->internal->byte_buffer) {
2929 int lastgob_pos =
s->ptr_lastgob -
s->pb.buf;
2931 uint8_t *new_buffer =
NULL;
2932 int new_buffer_size = 0;
2934 if ((
s->c.avctx->internal->byte_buffer_size + size_increase) >= INT_MAX/8) {
2942 s->c.avctx->internal->byte_buffer_size + size_increase);
2946 memcpy(new_buffer,
s->c.avctx->internal->byte_buffer,
s->c.avctx->internal->byte_buffer_size);
2947 av_free(
s->c.avctx->internal->byte_buffer);
2948 s->c.avctx->internal->byte_buffer = new_buffer;
2949 s->c.avctx->internal->byte_buffer_size = new_buffer_size;
2951 s->ptr_lastgob =
s->pb.buf + lastgob_pos;
2960 int chr_h = 16 >>
s->c.chroma_y_shift;
2985 s->last_dc[
i] = 128 <<
s->c.intra_dc_precision;
2987 s->encoding_error[
i] = 0;
2990 s->last_dc[0] = 128 * 8 / 13;
2991 s->last_dc[1] = 128 * 8 / 14;
2992 s->last_dc[2] = 128 * 8 / 14;
2993#if CONFIG_MPEG4_ENCODER
2994 }
else if (
s->partitioned_frame) {
3000 memset(
s->c.last_mv, 0,
sizeof(
s->c.last_mv));
3004 s->c.resync_mb_x = 0;
3005 s->c.resync_mb_y = 0;
3006 s->c.first_slice_line = 1;
3007 s->ptr_lastgob =
s->pb.buf;
3008 for (
int mb_y_order =
s->c.start_mb_y; mb_y_order < s->
c.end_mb_y; mb_y_order++) {
3013 if (first_in_slice && mb_y_order !=
s->c.start_mb_y)
3015 s->last_dc[0] =
s->last_dc[1] =
s->last_dc[2] = 1024;
3025 for (
int mb_x = 0; mb_x <
s->c.mb_width; mb_x++) {
3030 int size_increase =
s->c.avctx->internal->byte_buffer_size/4
3038 if (
s->data_partitioning) {
3052 xy =
s->c.mb_y *
s->c.mb_stride +
s->c.mb_x;
3053 mb_type =
s->mb_type[xy];
3057 int current_packet_size, is_gob_start;
3060 - (
s->ptr_lastgob -
s->pb.buf);
3062 is_gob_start =
s->rtp_payload_size &&
3063 current_packet_size >=
s->rtp_payload_size &&
3066 if (
s->c.start_mb_y == mb_y && mb_y > 0 && mb_x == 0) is_gob_start = 1;
3068 switch (
s->c.codec_id) {
3071 if (!
s->h263_slice_structured)
3072 if (
s->c.mb_x ||
s->c.mb_y %
s->gob_index) is_gob_start = 0;
3075 if (
s->c.mb_x == 0 &&
s->c.mb_y != 0) is_gob_start = 1;
3083 if (
s->c.mb_x == 0 &&
s->c.mb_y != 0) is_gob_start = 1;
3088 if (
s->c.start_mb_y != mb_y || mb_x != 0) {
3098 if (
s->error_rate &&
s->c.resync_mb_x +
s->c.resync_mb_y > 0) {
3100 int d = 100 /
s->error_rate;
3102 current_packet_size=0;
3103 s->pb.buf_ptr=
s->ptr_lastgob;
3108 switch (
s->c.codec_id) {
3110 if (CONFIG_MPEG4_ENCODER) {
3118 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
3123#if CONFIG_H263P_ENCODER
3130 if (CONFIG_H263_ENCODER) {
3132 s->mb_info_size += 12;
3142 s->misc_bits+=
bits -
s->last_bits;
3146 s->ptr_lastgob += current_packet_size;
3147 s->c.first_slice_line = 1;
3148 s->c.resync_mb_x = mb_x;
3149 s->c.resync_mb_y = mb_y;
3153 if (
s->c.resync_mb_x ==
s->c.mb_x &&
3154 s->c.resync_mb_y+1 ==
s->c.mb_y)
3155 s->c.first_slice_line = 0;
3157 s->c.mb_skipped = 0;
3164 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
3166 backup_context_before_encode(&backup_s,
s);
3168 if (
s->data_partitioning) {
3169 backup_s.pb2=
s->pb2;
3170 backup_s.tex_pb=
s->tex_pb;
3177 s->c.mv[0][0][0] =
s->p_mv_table[xy][0];
3178 s->c.mv[0][0][1] =
s->p_mv_table[xy][1];
3180 &dmin, &next_block,
s->c.mv[0][0][0],
s->c.mv[0][0][1]);
3187 int j =
s->c.field_select[0][
i] =
s->p_field_select_table[
i][xy];
3188 s->c.mv[0][
i][0] =
s->c.p_field_mv_table[
i][j][xy][0];
3189 s->c.mv[0][
i][1] =
s->c.p_field_mv_table[
i][j][xy][1];
3192 &dmin, &next_block, 0, 0);
3198 s->c.mv[0][0][0] = 0;
3199 s->c.mv[0][0][1] = 0;
3201 &dmin, &next_block,
s->c.mv[0][0][0],
s->c.mv[0][0][1]);
3208 s->c.mv[0][
i][0] =
s->c.cur_pic.motion_val[0][
s->c.block_index[
i]][0];
3209 s->c.mv[0][
i][1] =
s->c.cur_pic.motion_val[0][
s->c.block_index[
i]][1];
3212 &dmin, &next_block, 0, 0);
3218 s->c.mv[0][0][0] =
s->b_forw_mv_table[xy][0];
3219 s->c.mv[0][0][1] =
s->b_forw_mv_table[xy][1];
3221 &dmin, &next_block,
s->c.mv[0][0][0],
s->c.mv[0][0][1]);
3227 s->c.mv[1][0][0] =
s->b_back_mv_table[xy][0];
3228 s->c.mv[1][0][1] =
s->b_back_mv_table[xy][1];
3230 &dmin, &next_block,
s->c.mv[1][0][0],
s->c.mv[1][0][1]);
3236 s->c.mv[0][0][0] =
s->b_bidir_forw_mv_table[xy][0];
3237 s->c.mv[0][0][1] =
s->b_bidir_forw_mv_table[xy][1];
3238 s->c.mv[1][0][0] =
s->b_bidir_back_mv_table[xy][0];
3239 s->c.mv[1][0][1] =
s->b_bidir_back_mv_table[xy][1];
3241 &dmin, &next_block, 0, 0);
3248 int j =
s->c.field_select[0][
i] =
s->b_field_select_table[0][
i][xy];
3249 s->c.mv[0][
i][0] =
s->b_field_mv_table[0][
i][j][xy][0];
3250 s->c.mv[0][
i][1] =
s->b_field_mv_table[0][
i][j][xy][1];
3253 &dmin, &next_block, 0, 0);
3260 int j =
s->c.field_select[1][
i] =
s->b_field_select_table[1][
i][xy];
3261 s->c.mv[1][
i][0] =
s->b_field_mv_table[1][
i][j][xy][0];
3262 s->c.mv[1][
i][1] =
s->b_field_mv_table[1][
i][j][xy][1];
3265 &dmin, &next_block, 0, 0);
3271 for(dir=0; dir<2; dir++){
3273 int j =
s->c.field_select[dir][
i] =
s->b_field_select_table[dir][
i][xy];
3274 s->c.mv[dir][
i][0] =
s->b_field_mv_table[dir][
i][j][xy][0];
3275 s->c.mv[dir][
i][1] =
s->b_field_mv_table[dir][
i][j][xy][1];
3279 &dmin, &next_block, 0, 0);
3285 s->c.mv[0][0][0] = 0;
3286 s->c.mv[0][0][1] = 0;
3288 &dmin, &next_block, 0, 0);
3289 s->c.mbintra_table[xy] = 1;
3294 const int last_qp = backup_s.c.qscale;
3298 static const int dquant_tab[4]={-1,1,-2,2};
3299 int storecoefs =
s->c.mb_intra &&
s->c.dc_val;
3307 s->c.mv[0][0][0] = best_s.
c.
mv[0][0][0];
3308 s->c.mv[0][0][1] = best_s.
c.
mv[0][0][1];
3309 s->c.mv[1][0][0] = best_s.
c.
mv[1][0][0];
3310 s->c.mv[1][0][1] = best_s.
c.
mv[1][0][1];
3313 for(; qpi<4; qpi++){
3314 int dquant= dquant_tab[qpi];
3315 qp= last_qp + dquant;
3316 if (qp < s->
c.avctx->qmin || qp >
s->c.avctx->qmax)
3318 backup_s.dquant= dquant;
3321 dc[
i] =
s->c.dc_val[
s->c.block_index[
i]];
3322 memcpy(ac[
i],
s->c.ac_val[
s->c.block_index[
i]],
sizeof(*
s->c.ac_val));
3327 &dmin, &next_block,
s->c.mv[mvdir][0][0],
s->c.mv[mvdir][0][1]);
3331 s->c.dc_val[
s->c.block_index[
i]] = dc[
i];
3332 memcpy(
s->c.ac_val[
s->c.block_index[
i]], ac[
i],
sizeof(*
s->c.ac_val));
3340 int mx=
s->b_direct_mv_table[xy][0];
3341 int my=
s->b_direct_mv_table[xy][1];
3343 backup_s.dquant = 0;
3348 &dmin, &next_block,
mx,
my);
3351 backup_s.dquant = 0;
3356 &dmin, &next_block, 0, 0);
3361 coded |=
s->c.block_last_index[
i];
3364 memcpy(
s->c.mv, best_s.
c.
mv,
sizeof(
s->c.mv));
3369 mx =
s->c.mv[1][0][0];
3370 my =
s->c.mv[1][0][1];
3372 mx =
s->c.mv[0][0][0];
3373 my =
s->c.mv[0][0][1];
3386 &dmin, &next_block,
mx,
my);
3391 store_context_after_encode(
s, &best_s,
s->data_partitioning);
3395 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3398 if (
s->data_partitioning) {
3401 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3402 s->pb2= backup_s.pb2;
3406 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3407 s->tex_pb= backup_s.tex_pb;
3411 if (CONFIG_H263_ENCODER &&
3416 s->c.hdsp.put_pixels_tab[0][0](
s->c.dest[0],
s->c.sc.rd_scratchpad ,
s->c.linesize ,16);
3417 s->c.hdsp.put_pixels_tab[1][0](
s->c.dest[1],
s->c.sc.rd_scratchpad + 16*
s->c.linesize ,
s->c.uvlinesize, 8);
3418 s->c.hdsp.put_pixels_tab[1][0](
s->c.dest[2],
s->c.sc.rd_scratchpad + 16*
s->c.linesize + 8,
s->c.uvlinesize, 8);
3424 int motion_x = 0, motion_y = 0;
3432 motion_x=
s->c.mv[0][0][0] = 0;
3433 motion_y=
s->c.mv[0][0][1] = 0;
3434 s->c.mbintra_table[xy] = 1;
3439 motion_x=
s->c.mv[0][0][0] =
s->p_mv_table[xy][0];
3440 motion_y=
s->c.mv[0][0][1] =
s->p_mv_table[xy][1];
3447 int j =
s->c.field_select[0][
i] =
s->p_field_select_table[
i][xy];
3448 s->c.mv[0][
i][0] =
s->c.p_field_mv_table[
i][j][xy][0];
3449 s->c.mv[0][
i][1] =
s->c.p_field_mv_table[
i][j][xy][1];
3457 s->c.mv[0][
i][0] =
s->c.cur_pic.motion_val[0][
s->c.block_index[
i]][0];
3458 s->c.mv[0][
i][1] =
s->c.cur_pic.motion_val[0][
s->c.block_index[
i]][1];
3462 if (CONFIG_MPEG4_ENCODER) {
3465 motion_x=
s->b_direct_mv_table[xy][0];
3466 motion_y=
s->b_direct_mv_table[xy][1];
3471 if (CONFIG_MPEG4_ENCODER) {
3480 s->c.mv[0][0][0] =
s->b_bidir_forw_mv_table[xy][0];
3481 s->c.mv[0][0][1] =
s->b_bidir_forw_mv_table[xy][1];
3482 s->c.mv[1][0][0] =
s->b_bidir_back_mv_table[xy][0];
3483 s->c.mv[1][0][1] =
s->b_bidir_back_mv_table[xy][1];
3488 motion_x=
s->c.mv[1][0][0] =
s->b_back_mv_table[xy][0];
3489 motion_y=
s->c.mv[1][0][1] =
s->b_back_mv_table[xy][1];
3494 motion_x=
s->c.mv[0][0][0] =
s->b_forw_mv_table[xy][0];
3495 motion_y=
s->c.mv[0][0][1] =
s->b_forw_mv_table[xy][1];
3502 int j =
s->c.field_select[0][
i] =
s->b_field_select_table[0][
i][xy];
3503 s->c.mv[0][
i][0] =
s->b_field_mv_table[0][
i][j][xy][0];
3504 s->c.mv[0][
i][1] =
s->b_field_mv_table[0][
i][j][xy][1];
3512 int j =
s->c.field_select[1][
i] =
s->b_field_select_table[1][
i][xy];
3513 s->c.mv[1][
i][0] =
s->b_field_mv_table[1][
i][j][xy][0];
3514 s->c.mv[1][
i][1] =
s->b_field_mv_table[1][
i][j][xy][1];
3521 for(dir=0; dir<2; dir++){
3523 int j =
s->c.field_select[dir][
i] =
s->b_field_select_table[dir][
i][xy];
3524 s->c.mv[dir][
i][0] =
s->b_field_mv_table[dir][
i][j][xy][0];
3525 s->c.mv[dir][
i][1] =
s->b_field_mv_table[dir][
i][j][xy][1];
3531 "except CANDIDATE_MB_TYPE_SKIPPED which is never "
3532 "the only candidate (always coupled with INTER) "
3533 "so that it never reaches this switch");
3539 s->last_mv_dir =
s->c.mv_dir;
3541 if (CONFIG_H263_ENCODER &&
3548 s->c.cur_pic.qscale_table[xy] =
s->c.qscale;
3551 if (
s->c.mb_intra ) {
3552 s->p_mv_table[xy][0]=0;
3553 s->p_mv_table[xy][1]=0;
3554#if CONFIG_H263_ENCODER
3555 }
else if (
s->c.h263_pred ||
s->c.h263_aic) {
3564 if (
s->c.mb_x*16 + 16 >
s->c.width )
w =
s->c.width -
s->c.mb_x*16;
3565 if (
s->c.mb_y*16 + 16 >
s->c.height)
h =
s->c.height-
s->c.mb_y*16;
3567 s->encoding_error[0] +=
sse(
3568 s,
s->new_pic->data[0] +
s->c.mb_x*16 +
s->c.mb_y*
s->c.linesize*16,
3569 s->c.dest[0],
w,
h,
s->c.linesize);
3570 s->encoding_error[1] +=
sse(
3571 s,
s->new_pic->data[1] +
s->c.mb_x*8 +
s->c.mb_y*
s->c.uvlinesize*chr_h,
3572 s->c.dest[1],
w>>1,
h>>
s->c.chroma_y_shift,
s->c.uvlinesize);
3573 s->encoding_error[2] +=
sse(
3574 s,
s->new_pic->data[2] +
s->c.mb_x*8 +
s->c.mb_y*
s->c.uvlinesize*chr_h,
3575 s->c.dest[2],
w>>1,
h>>
s->c.chroma_y_shift,
s->c.uvlinesize);
3577 if (
s->loop_filter) {
3578 if (CONFIG_H263_ENCODER &&
s->c.out_format ==
FMT_H263)
3581 ff_dlog(
s->c.avctx,
"MB %d %d bits\n",
3586#if CONFIG_MSMPEG4ENC
3588 if (
s->c.msmpeg4_version != MSMP4_UNUSED &&
s->c.msmpeg4_version < MSMP4_WMV1 &&
3598#define ADD(field) dst->field += src->field;
3599#define MERGE(field) dst->field += src->field; src->field=0
3602 ADD(
me.scene_change_score);
3603 ADD(
me.mc_mb_var_sum_temp);
3604 ADD(
me.mb_var_sum_temp);
3611 MERGE(dct_count[0]);
3612 MERGE(dct_count[1]);
3618 ADD(encoding_error[0]);
3619 ADD(encoding_error[1]);
3620 ADD(encoding_error[2]);
3622 if (
dst->dct_error_sum) {
3623 for(
i=0;
i<64;
i++){
3624 MERGE(dct_error_sum[0][
i]);
3625 MERGE(dct_error_sum[1][
i]);
3644 s->c.cur_pic.ptr->f->quality =
quality;
3645 if (
s->c.cur_pic.ptr->f->quality < 0)
3649 if(
s->adaptive_quant){
3652 switch (
s->c.codec_id) {
3654 if (CONFIG_MPEG4_ENCODER)
3660 if (CONFIG_H263_ENCODER)
3665 s->lambda =
s->lambda_table[0];
3668 s->lambda =
s->c.cur_pic.ptr->f->quality;
3677 s->c.time =
s->c.cur_pic.ptr->f->pts *
s->c.avctx->time_base.num;
3680 s->c.pb_time =
s->c.pp_time - (
s->c.last_non_b_time -
s->c.time);
3681 av_assert1(
s->c.pb_time > 0 &&
s->c.pb_time <
s->c.pp_time);
3683 av_assert1(
s->picture_number == 0 ||
s->c.time >
s->c.last_non_b_time);
3684 s->c.pp_time =
s->c.time -
s->c.last_non_b_time;
3685 s->c.last_non_b_time =
s->c.time;
3694 int context_count =
s->c.slice_context_count;
3704 s->c.no_rounding =
s->c.msmpeg4_version >= MSMP4_V3;
3706 s->c.no_rounding ^=
s->flipflop_rounding;
3723 for (
int i = 0;
i < context_count;
i++) {
3725 int h =
s->c.mb_height;
3727 uint8_t *end =
pkt->data + (
int64_t)
pkt->size * slice->
c. end_mb_y /
h;
3750 &
s->c.enc_contexts[0],
NULL,
3751 context_count,
sizeof(
void*));
3756 NULL, context_count,
sizeof(
void*));
3759 for (
int i = 0;
i <
s->c.mb_stride *
s->c.mb_height;
i++)
3765 NULL, context_count,
sizeof(
void*));
3768 for (
int i = 1;
i < context_count;
i++)
3777 for (
int i = 0;
i <
s->c.mb_stride *
s->c.mb_height;
i++)
3779 if (
s->c.msmpeg4_version >= MSMP4_V3)
3780 s->c.no_rounding = 1;
3781 ff_dlog(
s->c.avctx,
"Scene change detected, encoding as I Frame %"PRId64
" %"PRId64
"\n",
3800 for (
int i = 0;
i < 2;
i++) {
3823 for(dir=0; dir<2; dir++){
3824 for (
int i = 0;
i < 2;
i++) {
3829 s->b_field_mv_table[dir][
i][j], dir ?
s->b_code :
s->f_code,
type, 1);
3841 if (
s->c.qscale < 3 &&
s->max_qcoeff <= 128 &&
3848 (7 +
s->c.qscale) /
s->c.qscale, 65535);
3856 if (
s->c.avctx->intra_matrix) {
3858 luma_matrix =
s->c.avctx->intra_matrix;
3860 if (
s->c.avctx->chroma_intra_matrix)
3861 chroma_matrix =
s->c.avctx->chroma_intra_matrix;
3864 for (
int i = 1;
i < 64;
i++) {
3865 int j =
s->c.idsp.idct_permutation[
i];
3867 s->c.chroma_intra_matrix[j] =
av_clip_uint8((chroma_matrix[
i] *
s->c.qscale) >> 3);
3868 s->c. intra_matrix[j] =
av_clip_uint8(( luma_matrix[
i] *
s->c.qscale) >> 3);
3870 s->c.chroma_intra_matrix[0] =
s->c.intra_matrix[0] = 8 >>
s->c.intra_dc_precision;
3872 static const uint8_t y[32] = {13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13};
3873 static const uint8_t
c[32] = {14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14};
3874 for (
int i = 1;
i < 64;
i++) {
3880 s->c.y_dc_scale_table = y;
3881 s->c.c_dc_scale_table =
c;
3882 s->c.intra_matrix[0] = 13;
3883 s->c.chroma_intra_matrix[0] = 14;
3886 s->c.intra_matrix,
s->intra_quant_bias, 8, 8, 1);
3888 s->c.chroma_intra_matrix,
s->intra_quant_bias, 8, 8, 1);
3897 s->c.cur_pic.ptr->f->pict_type =
s->c.pict_type;
3902 s->c.mb_x =
s->c.mb_y = 0;
3910 for (
int i = 1;
i < context_count;
i++)
3913 NULL, context_count,
sizeof(
void*));
3914 for (
int i = 1;
i < context_count;
i++) {
3915 if (
s->pb.buf_end ==
s->c.enc_contexts[
i]->pb.buf)
3925 if (!
s->dct_error_sum)
3928 const int intra =
s->c.mb_intra;
3929 s->dct_count[intra]++;
3930 s->mpvencdsp.denoise_dct(
block,
s->dct_error_sum[intra],
s->dct_offset[intra]);
3934 int16_t *
block,
int n,
3935 int qscale,
int *overflow){
3938 const uint8_t *scantable;
3939 const uint8_t *perm_scantable;
3941 unsigned int threshold1, threshold2;
3953 int coeff_count[64];
3954 int qmul, qadd, start_i, last_non_zero,
i, dc;
3955 const int esc_length=
s->ac_esc_length;
3956 const uint8_t *length, *last_length;
3965 qadd= ((qscale-1)|1)*8;
3968 else mpeg2_qscale = qscale << 1;
3970 if (
s->c.mb_intra) {
3972 scantable =
s->c.intra_scantable.scantable;
3973 perm_scantable =
s->c.intra_scantable.permutated;
3974 if (!
s->c.h263_aic) {
3976 q =
s->c.y_dc_scale;
3978 q =
s->c.c_dc_scale;
3990 qmat = n < 4 ?
s->q_intra_matrix[qscale] :
s->q_chroma_intra_matrix[qscale];
3991 matrix = n < 4 ?
s->c.intra_matrix :
s->c.chroma_intra_matrix;
3995 if (n > 3 &&
s->intra_chroma_ac_vlc_length) {
3996 length =
s->intra_chroma_ac_vlc_length;
3997 last_length=
s->intra_chroma_ac_vlc_last_length;
3999 length =
s->intra_ac_vlc_length;
4000 last_length=
s->intra_ac_vlc_last_length;
4003 scantable =
s->c.inter_scantable.scantable;
4004 perm_scantable =
s->c.inter_scantable.permutated;
4007 qmat =
s->q_inter_matrix[qscale];
4009 length =
s->inter_ac_vlc_length;
4010 last_length=
s->inter_ac_vlc_last_length;
4015 threshold2= (threshold1<<1);
4017 for(
i=63;
i>=start_i;
i--) {
4018 const int j = scantable[
i];
4021 if(((uint64_t)(
level+threshold1))>threshold2){
4027 for(
i=start_i;
i<=last_non_zero;
i++) {
4028 const int j = scantable[
i];
4033 if(((uint64_t)(
level+threshold1))>threshold2){
4054 *overflow=
s->max_qcoeff <
max;
4056 if(last_non_zero < start_i){
4057 memset(
block + start_i, 0, (64-start_i)*
sizeof(int16_t));
4058 return last_non_zero;
4061 score_tab[start_i]= 0;
4062 survivor[0]= start_i;
4065 for(
i=start_i;
i<=last_non_zero;
i++){
4066 int level_index, j, zero_distortion;
4068 int best_score=256*256*256*120;
4072 zero_distortion= dct_coeff*dct_coeff;
4074 for(level_index=0; level_index < coeff_count[
i]; level_index++){
4083 unquant_coeff= alevel*qmul + qadd;
4085 j =
s->c.idsp.idct_permutation[scantable[
i]];
4086 unquant_coeff = alevel *
matrix[j] * 8;
4088 j =
s->c.idsp.idct_permutation[scantable[
i]];
4089 if (
s->c.mb_intra) {
4090 unquant_coeff = (int)( alevel * mpeg2_qscale *
matrix[j]) >> 4;
4091 unquant_coeff = (unquant_coeff - 1) | 1;
4093 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((int)
matrix[j])) >> 5;
4094 unquant_coeff = (unquant_coeff - 1) | 1;
4099 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
4101 if((
level&(~127)) == 0){
4102 for(j=survivor_count-1; j>=0; j--){
4103 int run=
i - survivor[j];
4105 score += score_tab[
i-
run];
4107 if(score < best_score){
4110 level_tab[
i+1]=
level-64;
4115 for(j=survivor_count-1; j>=0; j--){
4116 int run=
i - survivor[j];
4118 score += score_tab[
i-
run];
4119 if(score < last_score){
4122 last_level=
level-64;
4128 distortion += esc_length*lambda;
4129 for(j=survivor_count-1; j>=0; j--){
4130 int run=
i - survivor[j];
4131 int score= distortion + score_tab[
i-
run];
4133 if(score < best_score){
4136 level_tab[
i+1]=
level-64;
4141 for(j=survivor_count-1; j>=0; j--){
4142 int run=
i - survivor[j];
4143 int score= distortion + score_tab[
i-
run];
4144 if(score < last_score){
4147 last_level=
level-64;
4155 score_tab[
i+1]= best_score;
4158 if(last_non_zero <= 27){
4159 for(; survivor_count; survivor_count--){
4160 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
4164 for(; survivor_count; survivor_count--){
4165 if(score_tab[ survivor[survivor_count-1] ] <= best_score + lambda)
4170 survivor[ survivor_count++ ]=
i+1;
4174 last_score= 256*256*256*120;
4175 for(
i= survivor[0];
i<=last_non_zero + 1;
i++){
4176 int score= score_tab[
i];
4178 score += lambda * 2;
4180 if(score < last_score){
4183 last_level= level_tab[
i];
4184 last_run= run_tab[
i];
4189 s->coded_score[n] = last_score;
4192 last_non_zero= last_i - 1;
4193 memset(
block + start_i, 0, (64-start_i)*
sizeof(int16_t));
4195 if(last_non_zero < start_i)
4196 return last_non_zero;
4198 if(last_non_zero == 0 && start_i == 0){
4200 int best_score= dc * dc;
4202 for(
i=0;
i<coeff_count[0];
i++){
4205 int unquant_coeff, score, distortion;
4208 unquant_coeff= (alevel*qmul + qadd)>>3;
4210 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((int)
matrix[0])) >> 5;
4211 unquant_coeff = (unquant_coeff - 1) | 1;
4213 unquant_coeff = (unquant_coeff + 4) >> 3;
4214 unquant_coeff<<= 3 + 3;
4216 distortion= (unquant_coeff - dc) * (unquant_coeff - dc);
4219 else score= distortion + esc_length*lambda;
4221 if(score < best_score){
4223 best_level=
level - 64;
4226 block[0]= best_level;
4227 s->coded_score[n] = best_score - dc*dc;
4228 if(best_level == 0)
return -1;
4229 else return last_non_zero;
4235 block[ perm_scantable[last_non_zero] ]= last_level;
4238 for(;
i>start_i;
i -= run_tab[
i] + 1){
4239 block[ perm_scantable[
i-1] ]= level_tab[
i];
4242 return last_non_zero;
4257 if(
i==0)
s*= sqrt(0.5);
4258 if(j==0)
s*= sqrt(0.5);
4271 const uint8_t *scantable;
4272 const uint8_t *perm_scantable;
4278 int qmul, qadd, start_i, last_non_zero,
i, dc;
4279 const uint8_t *length;
4280 const uint8_t *last_length;
4282 int rle_index,
run, q = 1, sum;
4284 if(
basis[0][0] == 0)
4289 if (
s->c.mb_intra) {
4290 scantable =
s->c.intra_scantable.scantable;
4291 perm_scantable =
s->c.intra_scantable.permutated;
4292 if (!
s->c.h263_aic) {
4294 q =
s->c.y_dc_scale;
4296 q =
s->c.c_dc_scale;
4309 if (n > 3 &&
s->intra_chroma_ac_vlc_length) {
4310 length =
s->intra_chroma_ac_vlc_length;
4311 last_length=
s->intra_chroma_ac_vlc_last_length;
4313 length =
s->intra_ac_vlc_length;
4314 last_length=
s->intra_ac_vlc_last_length;
4317 scantable =
s->c.inter_scantable.scantable;
4318 perm_scantable =
s->c.inter_scantable.permutated;
4321 length =
s->inter_ac_vlc_length;
4322 last_length=
s->inter_ac_vlc_last_length;
4324 last_non_zero =
s->c.block_last_index[n];
4327 for(
i=0;
i<64;
i++){
4332 for(
i=0;
i<64;
i++){
4338 w= 15 + (48*qns*one +
w/2)/
w;
4351 for(
i=start_i;
i<=last_non_zero;
i++){
4352 int j= perm_scantable[
i];
4359 run_tab[rle_index++]=
run;
4369 int best_score =
s->mpvencdsp.try_8x8basis(rem,
weight,
basis[0], 0);
4372 int run2, best_unquant_change=0, analyze_gradient;
4373 analyze_gradient = last_non_zero > 2 ||
s->quantizer_noise_shaping >= 3;
4375 if(analyze_gradient){
4376 for(
i=0;
i<64;
i++){
4386 int change, old_coeff;
4392 for(change=-1; change<=1; change+=2){
4393 int new_level=
level + change;
4394 int score, new_coeff;
4396 new_coeff= q*new_level;
4397 if(new_coeff >= 2048 || new_coeff < 0)
4400 score =
s->mpvencdsp.try_8x8basis(rem,
weight,
basis[0],
4401 new_coeff - old_coeff);
4402 if(score<best_score){
4405 best_change= change;
4406 best_unquant_change= new_coeff - old_coeff;
4413 run2= run_tab[rle_index++];
4417 for(
i=start_i;
i<64;
i++){
4418 int j= perm_scantable[
i];
4420 int change, old_coeff;
4422 if(
s->quantizer_noise_shaping < 3 &&
i > last_non_zero + 1)
4427 else old_coeff= qmul*
level + qadd;
4428 run2= run_tab[rle_index++];
4435 for(change=-1; change<=1; change+=2){
4436 int new_level=
level + change;
4437 int score, new_coeff, unquant_change;
4444 if(new_level<0) new_coeff= qmul*new_level - qadd;
4445 else new_coeff= qmul*new_level + qadd;
4446 if(new_coeff >= 2048 || new_coeff <= -2048)
4452 if(
i < last_non_zero)
4462 if(analyze_gradient){
4463 int g= d1[ scantable[
i] ];
4464 if(
g && (
g^new_level) >= 0)
4468 if(
i < last_non_zero){
4469 int next_i=
i + run2 + 1;
4470 int next_level=
block[ perm_scantable[next_i] ] + 64;
4472 if(next_level&(~127))
4475 if(next_i < last_non_zero)
4495 if(
i < last_non_zero){
4496 int next_i=
i + run2 + 1;
4497 int next_level=
block[ perm_scantable[next_i] ] + 64;
4499 if(next_level&(~127))
4502 if(next_i < last_non_zero)
4521 unquant_change= new_coeff - old_coeff;
4522 av_assert2((score < 100*lambda && score > -100*lambda) || lambda==0);
4524 score +=
s->mpvencdsp.try_8x8basis(rem,
weight,
basis[j],
4526 if(score<best_score){
4529 best_change= change;
4530 best_unquant_change= unquant_change;
4534 prev_level=
level + 64;
4535 if(prev_level&(~127))
4545 int j= perm_scantable[ best_coeff ];
4547 block[j] += best_change;
4549 if(best_coeff > last_non_zero){
4550 last_non_zero= best_coeff;
4553 for(; last_non_zero>=start_i; last_non_zero--){
4554 if(
block[perm_scantable[last_non_zero]])
4561 for(
i=start_i;
i<=last_non_zero;
i++){
4565 run_tab[rle_index++]=
run;
4572 s->mpvencdsp.add_8x8basis(rem,
basis[j], best_unquant_change);
4578 return last_non_zero;
4593 const uint8_t *scantable,
int last)
4604 for (
i = 0;
i <= last;
i++) {
4605 const int j = scantable[
i];
4610 for (
i = 0;
i <= last;
i++) {
4611 const int j = scantable[
i];
4612 const int perm_j = permutation[j];
4618 int16_t *
block,
int n,
4619 int qscale,
int *overflow)
4621 int i, last_non_zero, q, start_i;
4623 const uint8_t *scantable;
4626 unsigned int threshold1, threshold2;
4632 if (
s->c.mb_intra) {
4633 scantable =
s->c.intra_scantable.scantable;
4634 if (!
s->c.h263_aic) {
4636 q =
s->c.y_dc_scale;
4638 q =
s->c.c_dc_scale;
4648 qmat = n < 4 ?
s->q_intra_matrix[qscale] :
s->q_chroma_intra_matrix[qscale];
4651 scantable =
s->c.inter_scantable.scantable;
4654 qmat =
s->q_inter_matrix[qscale];
4658 threshold2= (threshold1<<1);
4659 for(
i=63;
i>=start_i;
i--) {
4660 const int j = scantable[
i];
4663 if(((uint64_t)(
level+threshold1))>threshold2){
4670 for(
i=start_i;
i<=last_non_zero;
i++) {
4671 const int j = scantable[
i];
4676 if(((uint64_t)(
level+threshold1))>threshold2){
4689 *overflow=
s->max_qcoeff <
max;
4694 scantable, last_non_zero);
4696 return last_non_zero;
const uint16_t ff_aanscales[64]
const uint16_t ff_inv_aanscales[64]
AAN (Arai, Agui and Nakajima) (I)DCT tables.
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t my
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t mx
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static double sqr(double in)
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Libavcodec external API header.
#define FF_MB_DECISION_RD
rate distortion
#define FF_DEBUG_DCT_COEFF
#define FF_MB_DECISION_BITS
chooses the one which needs the fewest bits
#define FF_MB_DECISION_SIMPLE
uses mb_cmp
void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
Copy the content of src to the bitstream.
#define i(width, name, range_min, range_max)
#define AV_CEIL_RSHIFT(a, b)
#define ROUNDED_DIV(a, b)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static int dct_error(const struct algo *dct, int test, int is_idct, int speed, const int bits)
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
#define FF_COMPLIANCE_NORMAL
AVCPBProperties * av_cpb_properties_alloc(size_t *size)
Allocate a CPB properties structure and initialize its fields to default values.
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
AVCPBProperties * ff_encode_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context.
int ff_encode_add_stats_side_data(AVPacket *pkt, int quality, const int64_t error[], int error_count, enum AVPictureType pict_type)
int ff_encode_reordered_opaque(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame)
Propagate user opaque values from the frame to avctx/pkt as needed.
int ff_encode_alloc_frame(AVCodecContext *avctx, AVFrame *frame)
Allocate buffers for a frame.
int ff_check_codec_matrices(AVCodecContext *avctx, unsigned types, uint16_t min, uint16_t max)
#define FF_MATRIX_TYPE_INTER
#define FF_MATRIX_TYPE_CHROMA_INTRA
#define FF_MATRIX_TYPE_INTRA
Check if the elements of codec context matrices (intra_matrix, inter_matrix or chroma_intra_matrix) a...
void ff_faandct(int16_t *data)
static const uint8_t bits[8]
void ff_fdct_ifast(int16_t *data)
void ff_jpeg_fdct_islow_10(int16_t *data)
void ff_jpeg_fdct_islow_8(int16_t *data)
#define AV_CODEC_FLAG_QPEL
Use qpel MC.
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
#define AV_CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
#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_CODEC_FLAG_CLOSED_GOP
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
#define AV_CODEC_FLAG_AC_PRED
H.263 advanced intra coding / MPEG-4 AC prediction.
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
#define AV_CODEC_FLAG_LOOP_FILTER
loop filter.
#define AV_CODEC_FLAG_INTERLACED_ME
interlaced motion estimation
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
#define AV_CODEC_FLAG_PSNR
error[?
#define AV_CODEC_FLAG_4MV
4 MV per MB allowed / advanced prediction for H.263.
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer.
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
Read encoded data from the encoder.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame)
Supply a raw video or audio frame to the encoder.
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
@ AV_PKT_DATA_H263_MB_INFO
An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of structures with info about macroblo...
@ AV_PKT_DATA_CPB_PROPERTIES
This side data corresponds to the AVCPBProperties struct.
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Shrink the already allocated side data buffer.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
int av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type, uint8_t *data, size_t size)
Wrap an existing array as a packet side data.
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
#define AVERROR_ENCODER_NOT_FOUND
Encoder not found.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_EOF
End of file.
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
static double av_q2d(AVRational a)
Convert an AVRational to a double.
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_P
Predicted.
@ AV_PICTURE_TYPE_S
S(GMC)-VOP MPEG-4.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define LIBAVUTIL_VERSION_INT
void ff_h261_reorder_mb_index(MPVEncContext *const s)
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
void ff_h263_loop_filter(MpegEncContext *s)
static void ff_h263_clean_intra_table_entries(MpegEncContext *s, int xy)
const uint16_t ff_h263_format[8][2]
void ff_h263_mpeg4_reset_dc(MPVEncContext *s)
void ff_h263_encode_gob_header(MPVEncContext *s, int mb_line)
void ff_clean_h263_qscales(MPVEncContext *s)
void ff_h263_encode_init(MPVMainEncContext *m)
void ff_h263_update_mb(MPVEncContext *s)
void(* op_pixels_func)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Average and put pixel Widths can be 16, 8, 4 or 2.
static void scale(int *out, const int *in, const int w, const int h, const int shift)
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
static int shift(int a, int b)
av_cold void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx)
common internal api header.
int ff_match_2uint16(const uint16_t(*tab)[2], int size, int a, int b)
Return the index into tab at which {a,b} match elements {[0],[1]} of tab.
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, int bits_per_raw_sample)
Macro definitions for various function/variable attributes.
common internal API header
#define FF_ALLOCZ_TYPED_ARRAY(p, nelem)
static int ff_thread_once(char *control, void(*routine)(void))
const uint8_t ff_zigzag_direct[64]
EXTERN const uint32_t ff_square_tab[512]
av_cold int ff_set_cmp(const MECmpContext *c, me_cmp_func *cmp, int type, int mpvenc)
Fill the function pointer array cmp[6] with me_cmp_funcs from c based upon type.
av_cold void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx)
int(* me_cmp_func)(MPVEncContext *c, const uint8_t *blk1, const uint8_t *blk2, ptrdiff_t stride, int h)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
#define LOCAL_ALIGNED_16(t, v,...)
int ff_mjpeg_encode_stuffing(MPVEncContext *const s)
Writes the complete JPEG frame when optimal huffman tables are enabled, otherwise writes the stuffing...
int ff_mjpeg_add_gain_map_size(AVCodecContext *avctx, struct MJpegContext *m, const AVFrame *frame, size_t *max_pkt_size)
int ff_mjpeg_add_icc_profile_size(AVCodecContext *avctx, const AVFrame *frame, size_t *max_pkt_size)
void ff_mjpeg_encode_picture_trailer(PutBitContext *pb, int header_bits)
static const uint8_t mv_bits[2][16][10]
int ff_get_best_fcode(MPVMainEncContext *const m, const int16_t(*mv_table)[2], int type)
void ff_estimate_p_frame_motion(MPVEncContext *const s, int mb_x, int mb_y)
void ff_me_init_pic(MPVEncContext *const s)
void ff_fix_long_p_mvs(MPVEncContext *const s, int type)
void ff_estimate_b_frame_motion(MPVEncContext *const s, int mb_x, int mb_y)
int ff_pre_estimate_p_frame_motion(MPVEncContext *const s, int mb_x, int mb_y)
void ff_fix_long_mvs(MPVEncContext *const s, uint8_t *field_select_table, int field_select, int16_t(*mv_table)[2], int f_code, int type, int truncate)
av_cold int ff_me_init(MotionEstContext *c, AVCodecContext *avctx, const MECmpContext *mecc, int mpvenc)
const uint16_t ff_mpeg1_default_intra_matrix[256]
const uint16_t ff_mpeg1_default_non_intra_matrix[64]
static void ff_mpeg1_clean_buffers(MPVEncContext *s)
void ff_mpeg1_encode_slice_header(MPVEncContext *s)
const int16_t ff_mpeg4_default_intra_matrix[64]
const int16_t ff_mpeg4_default_non_intra_matrix[64]
void ff_mpeg4_clean_buffers(MpegEncContext *s)
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
void ff_mpeg4_stuffing(PutBitContext *pbc)
add MPEG-4 stuffing bits (01...1)
void ff_mpeg4_init_partitions(MPVEncContext *const s)
void ff_clean_mpeg4_qscales(MPVEncContext *const s)
modify mb_type & qscale so that encoding is actually possible in MPEG-4
void ff_mpeg4_merge_partitions(MPVEncContext *const s)
void ff_set_mpeg4_time(MPVEncContext *const s)
void ff_mpeg4_encode_video_packet_header(MPVEncContext *const s)
void ff_mpv_unref_picture(MPVWorkPicture *pic)
int ff_mpv_pic_check_linesize(void *logctx, const AVFrame *f, ptrdiff_t *linesizep, ptrdiff_t *uvlinesizep)
int ff_mpv_alloc_pic_accessories(AVCodecContext *avctx, MPVWorkPicture *wpic, ScratchpadContext *sc, BufferPoolContext *pools, int mb_height)
Allocate an MPVPicture's accessories (but not the AVFrame's buffer itself) and set the MPVWorkPicture...
av_cold AVRefStructPool * ff_mpv_alloc_pic_pool(int init_progress)
Allocate a pool of MPVPictures.
void ff_mpv_replace_picture(MPVWorkPicture *dst, const MPVWorkPicture *src)
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
av_cold int ff_mpv_init_duplicate_contexts(MpegEncContext *s)
Initialize an MpegEncContext's thread contexts.
av_cold void ff_mpv_idct_init(MpegEncContext *s)
av_cold void ff_mpv_common_end(MpegEncContext *s)
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
void ff_init_block_index(MpegEncContext *s)
av_cold void ff_mpv_common_defaults(MpegEncContext *s)
Set the given MpegEncContext to common defaults (same for encoding and decoding).
int ff_update_duplicate_context(MpegEncContext *dst, const MpegEncContext *src)
void ff_mpv_motion(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int dir, uint8_t *const *ref_picture, const op_pixels_func(*pix_op)[4], const qpel_mc_func(*qpix_op)[16])
static void ff_update_block_index(MpegEncContext *s, int bits_per_raw_sample, int lowres, int chroma_x_shift)
#define MV_TYPE_FIELD
2 vectors, one per field
#define MV_TYPE_8X8
4 vectors (H.263, MPEG-4 4MV)
#define MV_DIRECT
bidirectional mode where the difference equals the MV of the last P/S/I-Frame (MPEG-4)
#define MV_TYPE_16X16
1 vector for the whole mb
static av_cold void mpv_encode_defaults(MPVMainEncContext *const m)
Set the given MPVEncContext to defaults for encoding.
static av_cold int init_matrices(MPVMainEncContext *const m, AVCodecContext *avctx)
static int sse(const MPVEncContext *const s, const uint8_t *src1, const uint8_t *src2, int w, int h, int stride)
static int encode_frame(AVCodecContext *c, const AVFrame *frame, AVPacket *pkt)
static int set_bframe_chain_length(MPVMainEncContext *const m)
Determines whether an input picture is discarded or not and if not determines the length of the next ...
static void merge_context_after_encode(MPVEncContext *const dst, MPVEncContext *const src)
static int dct_quantize_c(MPVEncContext *const s, int16_t *block, int n, int qscale, int *overflow)
static void put_dct(MPVEncContext *const s, int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
static av_cold void mpv_encode_init_static(void)
static const AVOption mpv_generic_options[]
void ff_block_permute(int16_t *block, const uint8_t *permutation, const uint8_t *scantable, int last)
Permute an 8x8 block according to permutation.
static av_cold void init_unquantize(MPVEncContext *const s2, AVCodecContext *avctx)
static void clip_coeffs(const MPVEncContext *const s, int16_t block[], int last_index)
static int dct_quantize_refine(MPVEncContext *const s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale)
static int mb_var_thread(AVCodecContext *c, void *arg)
static int estimate_best_b_count(MPVMainEncContext *const m)
static void add_dequant_dct(MPVEncContext *const s, int16_t *block, int i, uint8_t *dest, int line_size, int qscale)
static int estimate_motion_thread(AVCodecContext *c, void *arg)
static int skip_check(MPVMainEncContext *const m, const MPVPicture *p, const MPVPicture *ref)
const AVClass ff_mpv_enc_class
int ff_mpv_reallocate_putbitbuffer(MPVEncContext *const s, size_t threshold, size_t size_increase)
static void merge_context_after_me(MPVEncContext *const dst, MPVEncContext *const src)
#define ALLOCZ_ARRAYS(p, mult, numb)
static void encode_mb_hq(MPVEncContext *const s, MBBackup *const backup, MBBackup *const best, PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2], int *dmin, int *next_block, int motion_x, int motion_y)
av_cold void ff_dct_encode_init(MPVEncContext *const s)
static int pre_estimate_motion_thread(AVCodecContext *c, void *arg)
static int prepare_picture(MPVEncContext *const s, AVFrame *f, const AVFrame *props_frame)
Allocates new buffers for an AVFrame and copies the properties from another AVFrame.
static void encode_mb(MPVEncContext *const s, int motion_x, int motion_y)
static uint8_t default_fcode_tab[MAX_MV *2+1]
static void build_basis(uint8_t *perm)
static int sse_mb(MPVEncContext *const s)
static void update_noise_reduction(MPVMainEncContext *const m)
static int get_intra_count(MPVEncContext *const s, const uint8_t *src, const uint8_t *ref, int stride)
static int dct_quantize_trellis_c(MPVEncContext *const s, int16_t *block, int n, int qscale, int *overflow)
static void dct_single_coeff_elimination(MPVEncContext *const s, int n, int threshold)
static void update_duplicate_context_after_me(MPVEncContext *const dst, const MPVEncContext *const src)
static void write_slice_end(MPVEncContext *const s)
void ff_convert_matrix(MPVEncContext *const s, int(*qmat)[64], uint16_t(*qmat16)[2][64], const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
static void get_visual_weight(int16_t *weight, const uint8_t *ptr, int stride)
static void mpv_reconstruct_mb(MPVEncContext *const s, int16_t block[12][64])
Performs dequantization and IDCT (if necessary)
static int encode_picture(MPVMainEncContext *const s, const AVPacket *pkt)
av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
static void update_mb_info(MPVEncContext *const s)
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic_arg, int *got_packet)
static int16_t basis[64][64]
static av_cold int me_cmp_init(MPVMainEncContext *const m, AVCodecContext *avctx)
#define COPY_CONTEXT(BEFORE, AFTER, DST_TYPE, SRC_TYPE)
static av_cold int init_buffers(MPVMainEncContext *const m)
static av_always_inline void encode_mb_internal(MPVEncContext *const s, int motion_x, int motion_y, int mb_block_height, int mb_block_width, int mb_block_count, int chroma_x_shift, int chroma_y_shift, int chroma_format)
static void write_mb_info(MPVEncContext *const s)
static void init_qscale_tab(MPVEncContext *const s)
init s->c.cur_pic.qscale_table from s->lambda_table
void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
static void frame_end(MPVMainEncContext *const m)
static int select_input_picture(MPVMainEncContext *const m)
static int encode_thread(AVCodecContext *c, void *arg)
static void denoise_dct(MPVEncContext *const s, int16_t block[])
av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
#define INTERLACED_DCT(s)
static int get_sae(const uint8_t *src, int ref, int stride)
static int estimate_qp(MPVMainEncContext *const m, int dry_run)
static void update_qscale(MPVMainEncContext *const m)
static int load_input_picture(MPVMainEncContext *const m, const AVFrame *pic_arg)
static av_cold int init_slice_buffers(MPVMainEncContext *const m)
static void frame_start(MPVMainEncContext *const m)
static void set_frame_distances(MPVEncContext *const s)
#define ff_mpv_unquantize_init(s, bitexact, q_scale_type)
const uint8_t ff_mpeg2_non_linear_qscale[32]
const uint8_t ff_mpeg12_dc_scale_table[4][32]
static const uint8_t *const ff_mpeg1_dc_scale_table
static int get_bits_diff(MPVEncContext *s)
#define CANDIDATE_MB_TYPE_INTRA
#define MPVENC_MAX_B_FRAMES
#define FF_MPV_FLAG_CBP_RD
#define CANDIDATE_MB_TYPE_BACKWARD
#define CANDIDATE_MB_TYPE_FORWARD_I
#define CANDIDATE_MB_TYPE_INTER_I
#define CANDIDATE_MB_TYPE_BIDIR_I
#define CANDIDATE_MB_TYPE_BACKWARD_I
#define CANDIDATE_MB_TYPE_SKIPPED
#define CANDIDATE_MB_TYPE_INTER
#define CANDIDATE_MB_TYPE_DIRECT
#define CANDIDATE_MB_TYPE_BIDIR
#define CANDIDATE_MB_TYPE_FORWARD
void ff_dct_encode_init_x86(MPVEncContext *s)
#define FF_MPV_FLAG_QP_RD
#define UNI_AC_ENC_INDEX(run, level)
#define CANDIDATE_MB_TYPE_INTER4V
#define FF_MPV_COMMON_OPTS
#define CANDIDATE_MB_TYPE_DIRECT0
#define FF_MPV_FLAG_SKIP_RD
#define FF_MPV_COMMON_MOTION_EST_OPTS
#define FF_MPV_FLAG_STRICT_GOP
void ff_msmpeg4_encode_ext_header(MPVEncContext *const s)
av_cold void ff_msmpeg4_encode_init(MPVMainEncContext *const m)
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
static void rebase_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Rebase the bit writer onto a reallocated buffer.
static void set_put_bits_buffer_size(PutBitContext *s, int size)
Change the end of the buffer.
static int put_bits_count(PutBitContext *s)
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
static int put_bytes_count(const PutBitContext *s, int round_up)
static int put_bytes_left(const PutBitContext *s, int round_up)
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
void(* qpel_mc_func)(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
void ff_write_pass1_stats(MPVMainEncContext *const m)
void ff_get_2pass_fcode(MPVMainEncContext *const m)
av_cold void ff_rate_control_uninit(RateControlContext *rcc)
float ff_rate_estimate_qscale(MPVMainEncContext *const m, int dry_run)
int ff_vbv_update(MPVMainEncContext *m, int frame_size)
av_cold int ff_rate_control_init(MPVMainEncContext *const m)
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
const h264_weight_func weight
int ff_rv20_encode_picture_header(MPVMainEncContext *const m)
#define FF_ARRAY_ELEMS(a)
static const uint8_t sp5x_qscale_five_quant_table[][64]
void ff_speedhq_end_slice(MPVEncContext *const s)
static int ff_speedhq_mb_y_order_to_mb(int mb_y_order, int mb_height, int *first_in_slice)
This structure describes the bitrate properties of an encoded bitstream.
int64_t avg_bitrate
Average bitrate of the stream, in bits per second.
int64_t max_bitrate
Maximum bitrate of the stream, in bits per second.
int64_t buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
uint64_t vbv_delay
The delay between the time the packet this structure is associated with is received and the time when...
int64_t min_bitrate
Minimum bitrate of the stream, in bits per second.
Describe the class of an AVClass context structure.
main external API structure.
float rc_max_available_vbv_use
Ratecontrol attempt to use, at maximum, of what can be used without an underflow.
int trellis
trellis RD quantization
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
char * stats_out
pass1 encoding statistics output buffer
int rc_buffer_size
decoder bitstream buffer size
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
int qmin
minimum quantizer
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
uint16_t * inter_matrix
custom inter quantization matrix Must be allocated with the av_malloc() family of functions,...
int bit_rate_tolerance
number of bits the bitstream is allowed to diverge from the reference.
int mb_decision
macroblock decision mode
int has_b_frames
Size of the frame reordering buffer in the decoder.
int64_t bit_rate
the average bitrate
const struct AVCodec * codec
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
float temporal_cplx_masking
temporary complexity masking (0-> disabled)
float p_masking
p block masking (0-> disabled)
float dark_masking
darkness masking (0-> disabled)
int mb_cmp
macroblock comparison function (not supported yet)
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int ildct_cmp
interlaced DCT comparison function
int64_t rc_max_rate
maximum bitrate
int qmax
maximum quantizer
uint16_t * intra_matrix
custom intra quantization matrix Must be allocated with the av_malloc() family of functions,...
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
int flags
AV_CODEC_FLAG_*.
int64_t rc_min_rate
minimum bitrate
uint64_t error[AV_NUM_DATA_POINTERS]
error
float lumi_masking
luminance masking (0-> disabled)
struct AVCodecInternal * internal
Private context used for internal data.
float spatial_cplx_masking
spatial complexity masking (0-> disabled)
int slices
Number of slices.
unsigned int byte_buffer_size
uint8_t * byte_buffer
temporary buffer used for encoders to store their bitstream
int capabilities
Codec capabilities.
This structure describes decoded (raw) audio or video data.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int quality
quality (between 1 (good) and FF_LAMBDA_MAX (bad))
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
enum AVPictureType pict_type
Picture type of the frame.
This structure stores compressed data.
void(* fdct)(int16_t *block)
struct MBBackup::@342113007365243263012337326261363212055053105164 c
int(* sum_abs_dctelem)(const int16_t *block)
PutBitContext pb
bit output
MpegEncContext c
the common base context
uint16_t(* dct_offset)[64]
unsigned int lambda
Lagrange multiplier used in rate distortion.
int16_t(* block)[64]
points into blocks below
unsigned int lambda2
(lambda*lambda) >> FF_LAMBDA_SHIFT
int max_b_frames
max number of B-frames
int frame_bits
bits used for the current frame
int stuffing_bits
bits used for stuffing
MPVEncContext s
The main slicecontext.
RateControlContext rc_context
contains stuff only accessed in ratecontrol.c
int16_t(* mv_table_base)[2]
int vbv_delay_pos
offset of vbv_delay in the bitstream
int last_non_b_pict_type
used for MPEG-4 gmc B-frames & ratecontrol
int scenechange_threshold
int64_t mc_mb_var_sum
motion compensated MB variance for current frame
int last_lambda_for[5]
last lambda for a specific pict type
int64_t dts_delta
pts difference between the first and second input frame, used for calculating dts of the first frame ...
const uint8_t * fcode_tab
smallest fcode needed for each MV
int64_t mb_var_sum
sum of MB variance for current frame
char * dct_error_sum_base
backs dct_error_sum
AVFrame * tmp_frames[MPVENC_MAX_B_FRAMES+2]
temporary frames used by b_frame_strategy = 2
int me_penalty_compensation
int picture_in_gop_number
0-> first pic in gop, ...
int coded_picture_number
used to set pic->coded_picture_number
int fixed_qscale
fixed qscale if non zero
int next_lambda
next lambda used for retrying to encode a frame
int64_t user_specified_pts
last non-zero pts from user-supplied AVFrame
int input_picture_number
used to set pic->display_picture_number
int64_t reordered_pts
reordered pts to be used as dts for the next output frame when there's a delay
MPVPicture * reordered_input_picture[MPVENC_MAX_B_FRAMES+1]
next pictures in coded order
MPVPicture * input_picture[MPVENC_MAX_B_FRAMES+1]
next pictures in display order
me_cmp_func frame_skip_cmp_fn
int intra_only
if true, only intra pictures are generated
int me_pre
prepass for motion estimation
int(* encode_picture_header)(struct MPVMainEncContext *m)
int display_picture_number
void(* dct_unquantize_mpeg2_intra)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_mpeg1_intra)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_mpeg2_inter)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_h263_inter)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_h263_intra)(const MPVContext *s, int16_t *block, int n, int qscale)
void(* dct_unquantize_mpeg1_inter)(const MPVContext *s, int16_t *block, int n, int qscale)
uint8_t * scratchpad
data area for the ME algo, so that the ME does not need to malloc/free.
int16_t * dc_val
used for H.263 AIC/MPEG-4 DC prediction and ER
int start_mb_y
start mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)
int16_t(* ac_val)[16]
used for H.263 AIC, MPEG-4 AC prediction
double buffer_index
amount of bits in the video/audio buffer
int num_entries
number of RateControlEntries
uint8_t * scratchpad_buf
the other *_scratchpad point into this buffer
static int ref[MAX_W *MAX_W]
static const struct twinvq_data tab
static float mean(const float *input, int size)
static const double coeff[2][5]
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static const uint8_t quality[]
static int bias(int x, int c)