Go to the documentation of this file.
74 #define QUANT_BIAS_SHIFT 8
76 #define QMAT_SHIFT_MMX 16
90 #if FF_API_MPEGVIDEO_OPTS
107 uint16_t (*
qmat16)[2][64],
108 const uint16_t *quant_matrix,
109 int bias,
int qmin,
int qmax,
int intra)
120 else qscale2 =
qscale << 1;
127 for (
i = 0;
i < 64;
i++) {
128 const int j =
s->idsp.idct_permutation[
i];
129 int64_t den = (int64_t) qscale2 * quant_matrix[j];
139 for (
i = 0;
i < 64;
i++) {
140 const int j =
s->idsp.idct_permutation[
i];
141 int64_t den =
ff_aanscales[
i] * (int64_t) qscale2 * quant_matrix[j];
151 for (
i = 0;
i < 64;
i++) {
152 const int j =
s->idsp.idct_permutation[
i];
153 int64_t den = (int64_t) qscale2 * quant_matrix[j];
173 for (
i = intra;
i < 64;
i++) {
185 "Warning, QMAT_SHIFT is larger than %d, overflows possible\n",
192 if (
s->q_scale_type == 1 && 0) {
194 int bestdiff=INT_MAX;
202 if (
diff < bestdiff) {
211 s->qscale =
av_clip(
s->qscale,
s->avctx->qmin,
s->vbv_ignore_qmax ? 31 :
s->avctx->qmax);
224 for (
i = 0;
i < 64;
i++) {
236 int8_t *
const qscale_table =
s->current_picture.qscale_table;
239 for (
i = 0;
i <
s->mb_num;
i++) {
240 unsigned int lam =
s->lambda_table[
s->mb_index2xy[
i]];
242 qscale_table[
s->mb_index2xy[
i]] =
av_clip(qp,
s->avctx->qmin,
250 #define COPY(a) dst->a= src->a
268 for (
int i = -16;
i < 16;
i++)
287 s->input_picture_number = 0;
288 s->picture_in_gop_number = 0;
296 if (CONFIG_H263_ENCODER)
298 if (!
s->dct_quantize)
302 s->fast_dct_quantize =
s->dct_quantize;
303 if (
s->avctx->trellis)
342 "keyframe interval too large!, reducing it from %d to %d\n",
357 s->rtp_mode = !!
s->rtp_payload_size;
361 if (
s->intra_dc_precision < 0) {
362 s->intra_dc_precision += 8;
363 }
else if (
s->intra_dc_precision >= 8)
364 s->intra_dc_precision -= 8;
366 if (
s->intra_dc_precision < 0) {
368 "intra dc precision must be positive, note some applications use"
369 " 0 and some 8 as base meaning 8bit, the value must not be smaller than that\n");
382 if (
s->gop_size <= 1) {
436 "Warning min_rate > 0 but min_rate != max_rate isn't recommended!\n");
453 "impossible bitrate constraints, this will fail\n");
463 if (!
s->fixed_qscale &&
469 if (nbt <= INT_MAX) {
482 "Warning vbv_delay will be set to 0xFFFF (=VBR) as the "
483 "specified vbv buffer is too large for the given bitrate!\n");
495 "OBMC is only supported with simple mb decision\n");
504 if (
s->max_b_frames &&
511 if (
s->max_b_frames < 0) {
513 "max b frames must be 0 or positive for mpegvideo based encoders\n");
523 "Invalid pixel aspect ratio %i/%i, limit is 255/255 reducing\n",
581 "QP RD is no longer compatible with MJPEG or AMV\n");
585 if (
s->scenechange_threshold < 1000000000 &&
588 "closed gop with scene change detection are not supported yet, "
589 "set threshold to 1000000000\n");
597 "low delay forcing is only available for mpeg2, "
598 "set strict_std_compliance to 'unofficial' or lower in order to allow it\n");
601 if (
s->max_b_frames != 0) {
603 "B-frames cannot be used with low delay\n");
608 if (
s->q_scale_type == 1) {
611 "non linear quant only supports qmax <= 28 currently\n");
629 "multi threaded encoding not supported by codec\n");
635 "automatic thread number detection not supported by codec, "
642 "notice: b_frame_strategy only affects the first pass\n");
643 s->b_frame_strategy = 0;
657 s->inter_quant_bias = 0;
659 s->intra_quant_bias = 0;
674 "timebase %d/%d not supported by MPEG 4 standard, "
675 "the maximum admitted value for the timebase denominator "
686 avctx->
delay =
s->low_delay ? 0 : (
s->max_b_frames + 1);
691 avctx->
delay =
s->low_delay ? 0 : (
s->max_b_frames + 1);
694 #if CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER
708 if (!CONFIG_SPEEDHQ_ENCODER)
716 if (!CONFIG_H261_ENCODER)
720 "The specified picture size of %dx%d is not valid for the "
721 "H.261 codec.\nValid sizes are 176x144, 352x288\n",
722 s->width,
s->height);
731 if (!CONFIG_H263_ENCODER)
734 s->width,
s->height) == 8) {
736 "The specified picture size of %dx%d is not valid for "
737 "the H.263 codec.\nValid sizes are 128x96, 176x144, "
738 "352x288, 704x576, and 1408x1152. "
739 "Try H.263+.\n",
s->width,
s->height);
751 s->modified_quant =
s->h263_aic;
753 s->unrestricted_mv =
s->obmc ||
s->loop_filter ||
s->umvplus;
763 s->unrestricted_mv = 1;
777 s->modified_quant = 1;
781 s->unrestricted_mv = 0;
786 s->unrestricted_mv = 1;
787 s->low_delay =
s->max_b_frames ? 0 : 1;
788 avctx->
delay =
s->low_delay ? 0 : (
s->max_b_frames + 1);
793 s->unrestricted_mv = 1;
794 s->msmpeg4_version = 2;
801 s->unrestricted_mv = 1;
802 s->msmpeg4_version = 3;
803 s->flipflop_rounding = 1;
810 s->unrestricted_mv = 1;
811 s->msmpeg4_version = 4;
812 s->flipflop_rounding = 1;
819 s->unrestricted_mv = 1;
820 s->msmpeg4_version = 5;
821 s->flipflop_rounding = 1;
833 s->progressive_frame =
849 if (
s->msmpeg4_version) {
866 if (
s->noise_reduction) {
873 if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) &&
s->modified_quant)
876 if (
s->slice_context_count > 1) {
880 s->h263_slice_structured = 1;
883 s->quant_precision = 5;
886 ff_set_cmp(&
s->mecc,
s->mecc.frame_skip_cmp,
s->frame_skip_cmp);
888 if (CONFIG_H261_ENCODER &&
s->out_format ==
FMT_H261) {
890 }
else if ((CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
893 }
else if (CONFIG_H263_ENCODER &&
s->out_format ==
FMT_H263) {
900 for (
i = 0;
i < 64;
i++) {
901 int j =
s->idsp.idct_permutation[
i];
914 s->chroma_intra_matrix[j] =
938 if (
s->b_frame_strategy == 2) {
939 for (
i = 0;
i <
s->max_b_frames + 2;
i++) {
941 if (!
s->tmp_frames[
i])
945 s->tmp_frames[
i]->width =
s->width >>
s->brd_scale;
946 s->tmp_frames[
i]->height =
s->height >>
s->brd_scale;
973 if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) &&
986 if(
s->q_chroma_intra_matrix !=
s->q_intra_matrix )
av_freep(&
s->q_chroma_intra_matrix);
987 if(
s->q_chroma_intra_matrix16 !=
s->q_intra_matrix16)
av_freep(&
s->q_chroma_intra_matrix16);
988 s->q_chroma_intra_matrix=
NULL;
989 s->q_chroma_intra_matrix16=
NULL;
1006 for (y = 0; y < 16; y++) {
1007 for (x = 0; x < 16; x++) {
1022 h =
s->height & ~15;
1024 for (y = 0; y <
h; y += 16) {
1025 for (x = 0; x <
w; x += 16) {
1032 acc += sae + 500 < sad;
1041 s->chroma_x_shift,
s->chroma_y_shift,
s->out_format,
1042 s->mb_stride,
s->mb_width,
s->mb_height,
s->b8_stride,
1043 &
s->linesize, &
s->uvlinesize);
1050 int i, display_picture_number = 0,
ret;
1051 int encoding_delay =
s->max_b_frames ?
s->max_b_frames
1052 : (
s->low_delay ? 0 : 1);
1053 int flush_offset = 1;
1058 display_picture_number =
s->input_picture_number++;
1062 int64_t last =
s->user_specified_pts;
1066 "Invalid pts (%"PRId64
") <= last (%"PRId64
")\n",
1071 if (!
s->low_delay && display_picture_number == 1)
1072 s->dts_delta =
pts - last;
1074 s->user_specified_pts =
pts;
1077 s->user_specified_pts =
1078 pts =
s->user_specified_pts + 1;
1080 "Warning: AVFrame.pts=? trying to guess (%"PRId64
")\n",
1083 pts = display_picture_number;
1087 if (!pic_arg->
buf[0] ||
1089 pic_arg->
linesize[1] !=
s->uvlinesize ||
1092 if ((
s->width & 15) || (
s->height & 15))
1100 pic_arg->
linesize[1],
s->linesize,
s->uvlinesize);
1106 pic = &
s->picture[
i];
1123 int h_chroma_shift, v_chroma_shift;
1128 for (
i = 0;
i < 3;
i++) {
1130 int dst_stride =
i ?
s->uvlinesize :
s->linesize;
1131 int h_shift =
i ? h_chroma_shift : 0;
1132 int v_shift =
i ? v_chroma_shift : 0;
1133 int w =
s->width >> h_shift;
1134 int h =
s->height >> v_shift;
1136 uint8_t *dst = pic->
f->
data[
i];
1140 && !
s->progressive_sequence
1141 &&
FFALIGN(
s->height, 32) -
s->height > 16)
1144 if (!
s->avctx->rc_buffer_size)
1147 if (src_stride == dst_stride)
1148 memcpy(dst,
src, src_stride *
h);
1151 uint8_t *dst2 = dst;
1153 memcpy(dst2,
src,
w);
1158 if ((
s->width & 15) || (
s->height & (vpad-1))) {
1159 s->mpvencdsp.draw_edges(dst, dst_stride,
1178 for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
1179 if (
s->input_picture[flush_offset])
1182 if (flush_offset <= 1)
1185 encoding_delay = encoding_delay - flush_offset + 1;
1190 s->input_picture[
i - flush_offset] =
s->input_picture[
i];
1192 s->input_picture[encoding_delay] = (
Picture*) pic;
1201 int64_t score64 = 0;
1203 for (plane = 0; plane < 3; plane++) {
1205 const int bw = plane ? 1 : 2;
1206 for (y = 0; y <
s->mb_height * bw; y++) {
1207 for (x = 0; x <
s->mb_width * bw; x++) {
1208 int off = p->
shared ? 0 : 16;
1209 uint8_t *dptr = p->
f->
data[plane] + 8 * (x + y *
stride) + off;
1210 uint8_t *rptr =
ref->f->data[plane] + 8 * (x + y *
stride);
1211 int v =
s->mecc.frame_skip_cmp[1](
s, dptr, rptr,
stride, 8);
1213 switch (
FFABS(
s->frame_skip_exp)) {
1214 case 0: score =
FFMAX(score, v);
break;
1215 case 1: score +=
FFABS(v);
break;
1216 case 2: score64 += v * (int64_t)v;
break;
1217 case 3: score64 +=
FFABS(v * (int64_t)v * v);
break;
1218 case 4: score64 += (v * (int64_t)v) * (v * (int64_t)v);
break;
1227 if (
s->frame_skip_exp < 0)
1228 score64 = pow(score64 / (
double)(
s->mb_width *
s->mb_height),
1229 -1.0/
s->frame_skip_exp);
1233 if (score64 < ((
s->frame_skip_factor * (int64_t)
s->lambda) >> 8))
1263 const int scale =
s->brd_scale;
1267 int64_t best_rd = INT64_MAX;
1268 int best_b_count = -1;
1283 b_lambda = p_lambda;
1287 for (
i = 0;
i <
s->max_b_frames + 2;
i++) {
1288 Picture pre_input, *pre_input_ptr =
i ?
s->input_picture[
i - 1] :
1289 s->next_picture_ptr;
1292 if (pre_input_ptr && (!
i ||
s->input_picture[
i - 1])) {
1293 pre_input = *pre_input_ptr;
1302 s->mpvencdsp.shrink[
scale](
s->tmp_frames[
i]->data[0],
1303 s->tmp_frames[
i]->linesize[0],
1307 s->mpvencdsp.shrink[
scale](
s->tmp_frames[
i]->data[1],
1308 s->tmp_frames[
i]->linesize[1],
1312 s->mpvencdsp.shrink[
scale](
s->tmp_frames[
i]->data[2],
1313 s->tmp_frames[
i]->linesize[2],
1320 for (j = 0; j <
s->max_b_frames + 1; j++) {
1324 if (!
s->input_picture[j])
1337 c->mb_decision =
s->avctx->mb_decision;
1338 c->me_cmp =
s->avctx->me_cmp;
1339 c->mb_cmp =
s->avctx->mb_cmp;
1340 c->me_sub_cmp =
s->avctx->me_sub_cmp;
1342 c->time_base =
s->avctx->time_base;
1343 c->max_b_frames =
s->max_b_frames;
1361 for (
i = 0;
i <
s->max_b_frames + 1;
i++) {
1362 int is_p =
i % (j + 1) == j ||
i ==
s->max_b_frames;
1364 s->tmp_frames[
i + 1]->pict_type = is_p ?
1366 s->tmp_frames[
i + 1]->quality = is_p ? p_lambda : b_lambda;
1385 rd +=
c->error[0] +
c->error[1] +
c->error[2];
1403 return best_b_count;
1411 s->reordered_input_picture[
i - 1] =
s->reordered_input_picture[
i];
1415 if (!
s->reordered_input_picture[0] &&
s->input_picture[0]) {
1416 if (
s->frame_skip_threshold ||
s->frame_skip_factor) {
1417 if (
s->picture_in_gop_number <
s->gop_size &&
1418 s->next_picture_ptr &&
1430 !
s->next_picture_ptr ||
s->intra_only) {
1431 s->reordered_input_picture[0] =
s->input_picture[0];
1433 s->reordered_input_picture[0]->f->coded_picture_number =
1434 s->coded_picture_number++;
1439 for (
i = 0;
i <
s->max_b_frames + 1;
i++) {
1440 int pict_num =
s->input_picture[0]->f->display_picture_number +
i;
1442 if (pict_num >=
s->rc_context.num_entries)
1444 if (!
s->input_picture[
i]) {
1449 s->input_picture[
i]->f->pict_type =
1450 s->rc_context.entry[pict_num].new_pict_type;
1454 if (
s->b_frame_strategy == 0) {
1455 b_frames =
s->max_b_frames;
1456 while (b_frames && !
s->input_picture[b_frames])
1458 }
else if (
s->b_frame_strategy == 1) {
1459 for (
i = 1;
i <
s->max_b_frames + 1;
i++) {
1460 if (
s->input_picture[
i] &&
1461 s->input_picture[
i]->b_frame_score == 0) {
1462 s->input_picture[
i]->b_frame_score =
1464 s->input_picture[
i ]->f->data[0],
1465 s->input_picture[
i - 1]->f->data[0],
1469 for (
i = 0;
i <
s->max_b_frames + 1;
i++) {
1470 if (!
s->input_picture[
i] ||
1471 s->input_picture[
i]->b_frame_score - 1 >
1472 s->mb_num /
s->b_sensitivity)
1476 b_frames =
FFMAX(0,
i - 1);
1479 for (
i = 0;
i < b_frames + 1;
i++) {
1480 s->input_picture[
i]->b_frame_score = 0;
1482 }
else if (
s->b_frame_strategy == 2) {
1490 for (
i = b_frames - 1;
i >= 0;
i--) {
1491 int type =
s->input_picture[
i]->f->pict_type;
1496 b_frames ==
s->max_b_frames) {
1498 "warning, too many B-frames in a row\n");
1501 if (
s->picture_in_gop_number + b_frames >=
s->gop_size) {
1503 s->gop_size >
s->picture_in_gop_number) {
1504 b_frames =
s->gop_size -
s->picture_in_gop_number - 1;
1516 s->reordered_input_picture[0] =
s->input_picture[b_frames];
1519 s->reordered_input_picture[0]->f->coded_picture_number =
1520 s->coded_picture_number++;
1521 for (
i = 0;
i < b_frames;
i++) {
1522 s->reordered_input_picture[
i + 1] =
s->input_picture[
i];
1523 s->reordered_input_picture[
i + 1]->f->pict_type =
1525 s->reordered_input_picture[
i + 1]->f->coded_picture_number =
1526 s->coded_picture_number++;
1533 if (
s->reordered_input_picture[0]) {
1534 s->reordered_input_picture[0]->reference =
1535 s->reordered_input_picture[0]->f->pict_type !=
1541 if (
s->reordered_input_picture[0]->shared ||
s->avctx->rc_buffer_size) {
1549 pic = &
s->picture[
i];
1551 pic->
reference =
s->reordered_input_picture[0]->reference;
1562 s->reordered_input_picture[0]->shared = 0;
1564 s->current_picture_ptr = pic;
1567 s->current_picture_ptr =
s->reordered_input_picture[0];
1568 for (
i = 0;
i < 4;
i++) {
1569 if (
s->new_picture.f->data[
i])
1575 s->current_picture_ptr)) < 0)
1578 s->picture_number =
s->new_picture.f->display_picture_number;
1585 if (
s->unrestricted_mv &&
1586 s->current_picture.reference &&
1589 int hshift =
desc->log2_chroma_w;
1590 int vshift =
desc->log2_chroma_h;
1591 s->mpvencdsp.draw_edges(
s->current_picture.f->data[0],
1592 s->current_picture.f->linesize[0],
1593 s->h_edge_pos,
s->v_edge_pos,
1596 s->mpvencdsp.draw_edges(
s->current_picture.f->data[1],
1597 s->current_picture.f->linesize[1],
1598 s->h_edge_pos >> hshift,
1599 s->v_edge_pos >> vshift,
1603 s->mpvencdsp.draw_edges(
s->current_picture.f->data[2],
1604 s->current_picture.f->linesize[2],
1605 s->h_edge_pos >> hshift,
1606 s->v_edge_pos >> vshift,
1614 s->last_pict_type =
s->pict_type;
1615 s->last_lambda_for [
s->pict_type] =
s->current_picture_ptr->f->quality;
1617 s->last_non_b_pict_type =
s->pict_type;
1624 for (intra = 0; intra < 2; intra++) {
1625 if (
s->dct_count[intra] > (1 << 16)) {
1626 for (
i = 0;
i < 64;
i++) {
1627 s->dct_error_sum[intra][
i] >>= 1;
1629 s->dct_count[intra] >>= 1;
1632 for (
i = 0;
i < 64;
i++) {
1633 s->dct_offset[intra][
i] = (
s->noise_reduction *
1634 s->dct_count[intra] +
1635 s->dct_error_sum[intra][
i] / 2) /
1636 (
s->dct_error_sum[intra][
i] + 1);
1647 s->last_picture_ptr !=
s->next_picture_ptr &&
1648 s->last_picture_ptr->f->buf[0]) {
1652 s->current_picture_ptr->f->pict_type =
s->pict_type;
1657 s->current_picture_ptr)) < 0)
1661 s->last_picture_ptr =
s->next_picture_ptr;
1662 s->next_picture_ptr =
s->current_picture_ptr;
1665 if (
s->last_picture_ptr) {
1667 if (
s->last_picture_ptr->f->buf[0] &&
1669 s->last_picture_ptr)) < 0)
1672 if (
s->next_picture_ptr) {
1674 if (
s->next_picture_ptr->f->buf[0] &&
1676 s->next_picture_ptr)) < 0)
1682 for (
i = 0;
i < 4;
i++) {
1684 s->current_picture.f->data[
i] +=
1685 s->current_picture.f->linesize[
i];
1687 s->current_picture.f->linesize[
i] *= 2;
1688 s->last_picture.f->linesize[
i] *= 2;
1689 s->next_picture.f->linesize[
i] *= 2;
1694 s->dct_unquantize_intra =
s->dct_unquantize_mpeg2_intra;
1695 s->dct_unquantize_inter =
s->dct_unquantize_mpeg2_inter;
1697 s->dct_unquantize_intra =
s->dct_unquantize_h263_intra;
1698 s->dct_unquantize_inter =
s->dct_unquantize_h263_inter;
1700 s->dct_unquantize_intra =
s->dct_unquantize_mpeg1_intra;
1701 s->dct_unquantize_inter =
s->dct_unquantize_mpeg1_inter;
1704 if (
s->dct_error_sum) {
1713 const AVFrame *pic_arg,
int *got_packet)
1716 int i, stuffing_count,
ret;
1717 int context_count =
s->slice_context_count;
1719 s->vbv_ignore_qmax = 0;
1721 s->picture_in_gop_number++;
1731 if (
s->new_picture.f->data[0]) {
1732 int growing_buffer = context_count == 1 && !
pkt->
data && !
s->data_partitioning;
1741 s->mb_width*
s->mb_height*12);
1742 s->prev_mb_info =
s->last_mb_info =
s->mb_info_size = 0;
1745 for (
i = 0;
i < context_count;
i++) {
1746 int start_y =
s->thread_context[
i]->start_mb_y;
1748 int h =
s->mb_height;
1749 uint8_t *start =
pkt->
data + (size_t)(((int64_t)
pkt->
size) * start_y /
h);
1750 uint8_t *end =
pkt->
data + (size_t)(((int64_t)
pkt->
size) * end_y /
h);
1755 s->pict_type =
s->new_picture.f->pict_type;
1762 if (growing_buffer) {
1772 if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) &&
s->out_format ==
FMT_MJPEG)
1782 s->lambda <
s->lmax) {
1783 s->next_lambda =
FFMAX(
s->lambda + min_step,
s->lambda *
1784 (
s->qscale + 1) /
s->qscale);
1785 if (
s->adaptive_quant) {
1787 for (
i = 0;
i <
s->mb_height *
s->mb_stride;
i++)
1788 s->lambda_table[
i] =
1789 FFMAX(
s->lambda_table[
i] + min_step,
1790 s->lambda_table[
i] * (
s->qscale + 1) /
1796 if (
s->flipflop_rounding ||
1799 s->no_rounding ^= 1;
1802 s->time_base =
s->last_time_base;
1803 s->last_non_b_time =
s->time -
s->pp_time;
1805 for (
i = 0;
i < context_count;
i++) {
1809 s->vbv_ignore_qmax = 1;
1820 for (
i = 0;
i < 4;
i++) {
1821 s->current_picture_ptr->encoding_error[
i] =
s->current_picture.encoding_error[
i];
1822 avctx->
error[
i] +=
s->current_picture_ptr->encoding_error[
i];
1825 s->current_picture_ptr->encoding_error,
1831 s->misc_bits +
s->i_tex_bits +
1837 s->stuffing_bits = 8*stuffing_count;
1838 if (stuffing_count) {
1844 switch (
s->codec_id) {
1847 while (stuffing_count--) {
1854 stuffing_count -= 4;
1855 while (stuffing_count--) {
1861 s->stuffing_bits = 0;
1879 int minbits =
s->frame_bits - 8 *
1880 (
s->vbv_delay_ptr -
s->pb.buf - 1);
1881 double bits =
s->rc_context.buffer_index + minbits - inbits;
1885 "Internal error, negative bits\n");
1897 s->vbv_delay_ptr[0] &= 0xF8;
1900 s->vbv_delay_ptr[2] &= 0x07;
1909 (uint8_t*)props, props_size);
1915 s->total_bits +=
s->frame_bits;
1917 pkt->
pts =
s->current_picture.f->pts;
1919 if (!
s->current_picture.f->coded_picture_number)
1926 if (
s->current_picture.f->key_frame)
1936 if (!
s->picture[
i].reference)
1948 int n,
int threshold)
1950 static const char tab[64] = {
1951 3, 2, 2, 1, 1, 1, 1, 1,
1952 1, 1, 1, 1, 1, 1, 1, 1,
1953 1, 1, 1, 1, 1, 1, 1, 1,
1954 0, 0, 0, 0, 0, 0, 0, 0,
1955 0, 0, 0, 0, 0, 0, 0, 0,
1956 0, 0, 0, 0, 0, 0, 0, 0,
1957 0, 0, 0, 0, 0, 0, 0, 0,
1958 0, 0, 0, 0, 0, 0, 0, 0
1963 int16_t *
block =
s->block[n];
1964 const int last_index =
s->block_last_index[n];
1967 if (threshold < 0) {
1969 threshold = -threshold;
1974 if (last_index <= skip_dc - 1)
1977 for (
i = 0;
i <= last_index;
i++) {
1978 const int j =
s->intra_scantable.permutated[
i];
1981 if (skip_dc &&
i == 0)
1985 }
else if (
level > 1) {
1991 if (score >= threshold)
1993 for (
i = skip_dc;
i <= last_index;
i++) {
1994 const int j =
s->intra_scantable.permutated[
i];
1998 s->block_last_index[n] = 0;
2000 s->block_last_index[n] = -1;
2007 const int maxlevel =
s->max_qcoeff;
2008 const int minlevel =
s->min_qcoeff;
2016 for (;
i <= last_index;
i++) {
2017 const int j =
s->intra_scantable.permutated[
i];
2020 if (
level > maxlevel) {
2023 }
else if (
level < minlevel) {
2033 "warning, clipping %d dct coefficients to %d..%d\n",
2041 for (y = 0; y < 8; y++) {
2042 for (x = 0; x < 8; x++) {
2048 for (y2 =
FFMAX(y - 1, 0); y2 <
FFMIN(8, y + 2); y2++) {
2049 for (x2=
FFMAX(x - 1, 0); x2 <
FFMIN(8, x + 2); x2++) {
2050 int v = ptr[x2 + y2 *
stride];
2062 int motion_x,
int motion_y,
2063 int mb_block_height,
2068 int16_t orig[12][64];
2069 const int mb_x =
s->mb_x;
2070 const int mb_y =
s->mb_y;
2074 int uv_dct_offset =
s->uvlinesize * 8;
2075 uint8_t *ptr_y, *ptr_cb, *ptr_cr;
2076 ptrdiff_t wrap_y, wrap_c;
2078 for (
i = 0;
i < mb_block_count;
i++)
2079 skip_dct[
i] =
s->skipdct;
2081 if (
s->adaptive_quant) {
2082 const int last_qp =
s->qscale;
2083 const int mb_xy =
mb_x +
mb_y *
s->mb_stride;
2085 s->lambda =
s->lambda_table[mb_xy];
2089 s->qscale =
s->current_picture_ptr->qscale_table[mb_xy];
2090 s->dquant =
s->qscale - last_qp;
2111 wrap_y =
s->linesize;
2112 wrap_c =
s->uvlinesize;
2113 ptr_y =
s->new_picture.f->data[0] +
2115 ptr_cb =
s->new_picture.f->data[1] +
2116 (
mb_y * mb_block_height * wrap_c) +
mb_x * mb_block_width;
2117 ptr_cr =
s->new_picture.f->data[2] +
2118 (
mb_y * mb_block_height * wrap_c) +
mb_x * mb_block_width;
2121 uint8_t *ebuf =
s->sc.edge_emu_buffer + 38 * wrap_y;
2122 int cw = (
s->width +
s->chroma_x_shift) >>
s->chroma_x_shift;
2123 int ch = (
s->height +
s->chroma_y_shift) >>
s->chroma_y_shift;
2124 s->vdsp.emulated_edge_mc(ebuf, ptr_y,
2127 s->width,
s->height);
2129 s->vdsp.emulated_edge_mc(ebuf + 16 * wrap_y, ptr_cb,
2131 mb_block_width, mb_block_height,
2132 mb_x * mb_block_width,
mb_y * mb_block_height,
2134 ptr_cb = ebuf + 16 * wrap_y;
2135 s->vdsp.emulated_edge_mc(ebuf + 16 * wrap_y + 16, ptr_cr,
2137 mb_block_width, mb_block_height,
2138 mb_x * mb_block_width,
mb_y * mb_block_height,
2140 ptr_cr = ebuf + 16 * wrap_y + 16;
2145 int progressive_score, interlaced_score;
2147 s->interlaced_dct = 0;
2148 progressive_score =
s->mecc.ildct_cmp[4](
s, ptr_y,
NULL, wrap_y, 8) +
2149 s->mecc.ildct_cmp[4](
s, ptr_y + wrap_y * 8,
2150 NULL, wrap_y, 8) - 400;
2152 if (progressive_score > 0) {
2153 interlaced_score =
s->mecc.ildct_cmp[4](
s, ptr_y,
2154 NULL, wrap_y * 2, 8) +
2155 s->mecc.ildct_cmp[4](
s, ptr_y + wrap_y,
2156 NULL, wrap_y * 2, 8);
2157 if (progressive_score > interlaced_score) {
2158 s->interlaced_dct = 1;
2161 uv_dct_offset = wrap_c;
2170 s->pdsp.get_pixels(
s->block[0], ptr_y, wrap_y);
2171 s->pdsp.get_pixels(
s->block[1], ptr_y + 8, wrap_y);
2172 s->pdsp.get_pixels(
s->block[2], ptr_y +
dct_offset, wrap_y);
2173 s->pdsp.get_pixels(
s->block[3], ptr_y +
dct_offset + 8, wrap_y);
2179 s->pdsp.get_pixels(
s->block[4], ptr_cb, wrap_c);
2180 s->pdsp.get_pixels(
s->block[5], ptr_cr, wrap_c);
2181 if (!
s->chroma_y_shift &&
s->chroma_x_shift) {
2182 s->pdsp.get_pixels(
s->block[6], ptr_cb + uv_dct_offset, wrap_c);
2183 s->pdsp.get_pixels(
s->block[7], ptr_cr + uv_dct_offset, wrap_c);
2184 }
else if (!
s->chroma_y_shift && !
s->chroma_x_shift) {
2185 s->pdsp.get_pixels(
s->block[ 6], ptr_cb + 8, wrap_c);
2186 s->pdsp.get_pixels(
s->block[ 7], ptr_cr + 8, wrap_c);
2187 s->pdsp.get_pixels(
s->block[ 8], ptr_cb + uv_dct_offset, wrap_c);
2188 s->pdsp.get_pixels(
s->block[ 9], ptr_cr + uv_dct_offset, wrap_c);
2189 s->pdsp.get_pixels(
s->block[10], ptr_cb + uv_dct_offset + 8, wrap_c);
2190 s->pdsp.get_pixels(
s->block[11], ptr_cr + uv_dct_offset + 8, wrap_c);
2196 uint8_t *dest_y, *dest_cb, *dest_cr;
2198 dest_y =
s->dest[0];
2199 dest_cb =
s->dest[1];
2200 dest_cr =
s->dest[2];
2203 op_pix =
s->hdsp.put_pixels_tab;
2204 op_qpix =
s->qdsp.put_qpel_pixels_tab;
2206 op_pix =
s->hdsp.put_no_rnd_pixels_tab;
2207 op_qpix =
s->qdsp.put_no_rnd_qpel_pixels_tab;
2212 s->last_picture.f->data,
2214 op_pix =
s->hdsp.avg_pixels_tab;
2215 op_qpix =
s->qdsp.avg_qpel_pixels_tab;
2219 s->next_picture.f->data,
2224 int progressive_score, interlaced_score;
2226 s->interlaced_dct = 0;
2227 progressive_score =
s->mecc.ildct_cmp[0](
s, dest_y, ptr_y, wrap_y, 8) +
2228 s->mecc.ildct_cmp[0](
s, dest_y + wrap_y * 8,
2233 progressive_score -= 400;
2235 if (progressive_score > 0) {
2236 interlaced_score =
s->mecc.ildct_cmp[0](
s, dest_y, ptr_y,
2238 s->mecc.ildct_cmp[0](
s, dest_y + wrap_y,
2242 if (progressive_score > interlaced_score) {
2243 s->interlaced_dct = 1;
2246 uv_dct_offset = wrap_c;
2254 s->pdsp.diff_pixels(
s->block[0], ptr_y, dest_y, wrap_y);
2255 s->pdsp.diff_pixels(
s->block[1], ptr_y + 8, dest_y + 8, wrap_y);
2258 s->pdsp.diff_pixels(
s->block[3], ptr_y +
dct_offset + 8,
2265 s->pdsp.diff_pixels(
s->block[4], ptr_cb, dest_cb, wrap_c);
2266 s->pdsp.diff_pixels(
s->block[5], ptr_cr, dest_cr, wrap_c);
2267 if (!
s->chroma_y_shift) {
2268 s->pdsp.diff_pixels(
s->block[6], ptr_cb + uv_dct_offset,
2269 dest_cb + uv_dct_offset, wrap_c);
2270 s->pdsp.diff_pixels(
s->block[7], ptr_cr + uv_dct_offset,
2271 dest_cr + uv_dct_offset, wrap_c);
2275 if (
s->current_picture.mc_mb_var[
s->mb_stride *
mb_y +
mb_x] <
2276 2 *
s->qscale *
s->qscale) {
2278 if (
s->mecc.sad[1](
NULL, ptr_y, dest_y, wrap_y, 8) < 20 *
s->qscale)
2280 if (
s->mecc.sad[1](
NULL, ptr_y + 8, dest_y + 8, wrap_y, 8) < 20 *
s->qscale)
2283 wrap_y, 8) < 20 *
s->qscale)
2286 wrap_y, 8) < 20 *
s->qscale)
2288 if (
s->mecc.sad[1](
NULL, ptr_cb, dest_cb, wrap_c, 8) < 20 *
s->qscale)
2290 if (
s->mecc.sad[1](
NULL, ptr_cr, dest_cr, wrap_c, 8) < 20 *
s->qscale)
2292 if (!
s->chroma_y_shift) {
2293 if (
s->mecc.sad[1](
NULL, ptr_cb + uv_dct_offset,
2294 dest_cb + uv_dct_offset,
2295 wrap_c, 8) < 20 *
s->qscale)
2297 if (
s->mecc.sad[1](
NULL, ptr_cr + uv_dct_offset,
2298 dest_cr + uv_dct_offset,
2299 wrap_c, 8) < 20 *
s->qscale)
2305 if (
s->quantizer_noise_shaping) {
2318 if (!
s->chroma_y_shift) {
2326 memcpy(orig[0],
s->block[0],
sizeof(int16_t) * 64 * mb_block_count);
2332 for (
i = 0;
i < mb_block_count;
i++) {
2335 s->block_last_index[
i] =
s->dct_quantize(
s,
s->block[
i],
i,
s->qscale, &
overflow);
2344 s->block_last_index[
i] = -1;
2346 if (
s->quantizer_noise_shaping) {
2347 for (
i = 0;
i < mb_block_count;
i++) {
2349 s->block_last_index[
i] =
2351 orig[
i],
i,
s->qscale);
2356 if (
s->luma_elim_threshold && !
s->mb_intra)
2357 for (
i = 0;
i < 4;
i++)
2359 if (
s->chroma_elim_threshold && !
s->mb_intra)
2360 for (
i = 4;
i < mb_block_count;
i++)
2364 for (
i = 0;
i < mb_block_count;
i++) {
2365 if (
s->block_last_index[
i] == -1)
2366 s->coded_score[
i] = INT_MAX / 256;
2372 s->block_last_index[4] =
2373 s->block_last_index[5] = 0;
2375 s->block[5][0] = (1024 +
s->c_dc_scale / 2) /
s->c_dc_scale;
2376 if (!
s->chroma_y_shift) {
2377 for (
i=6;
i<12;
i++) {
2378 s->block_last_index[
i] = 0;
2379 s->block[
i][0] =
s->block[4][0];
2386 for (
i = 0;
i < mb_block_count;
i++) {
2388 if (
s->block_last_index[
i] > 0) {
2389 for (j = 63; j > 0; j--) {
2390 if (
s->block[
i][
s->intra_scantable.permutated[j]])
2393 s->block_last_index[
i] = j;
2399 switch(
s->codec_id){
2402 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
2406 if (CONFIG_MPEG4_ENCODER)
2416 if (CONFIG_WMV2_ENCODER)
2420 if (CONFIG_H261_ENCODER)
2428 if (CONFIG_H263_ENCODER)
2431 #if CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER
2438 if (CONFIG_SPEEDHQ_ENCODER)
2456 memcpy(
d->last_mv,
s->last_mv, 2*2*2*
sizeof(
int));
2459 d->mb_skip_run=
s->mb_skip_run;
2461 d->last_dc[
i] =
s->last_dc[
i];
2464 d->mv_bits=
s->mv_bits;
2465 d->i_tex_bits=
s->i_tex_bits;
2466 d->p_tex_bits=
s->p_tex_bits;
2467 d->i_count=
s->i_count;
2468 d->f_count=
s->f_count;
2469 d->b_count=
s->b_count;
2470 d->skip_count=
s->skip_count;
2471 d->misc_bits=
s->misc_bits;
2475 d->qscale=
s->qscale;
2476 d->dquant=
s->dquant;
2478 d->esc3_level_length=
s->esc3_level_length;
2484 memcpy(
d->mv,
s->mv, 2*4*2*
sizeof(
int));
2485 memcpy(
d->last_mv,
s->last_mv, 2*2*2*
sizeof(
int));
2488 d->mb_skip_run=
s->mb_skip_run;
2490 d->last_dc[
i] =
s->last_dc[
i];
2493 d->mv_bits=
s->mv_bits;
2494 d->i_tex_bits=
s->i_tex_bits;
2495 d->p_tex_bits=
s->p_tex_bits;
2496 d->i_count=
s->i_count;
2497 d->f_count=
s->f_count;
2498 d->b_count=
s->b_count;
2499 d->skip_count=
s->skip_count;
2500 d->misc_bits=
s->misc_bits;
2502 d->mb_intra=
s->mb_intra;
2503 d->mb_skipped=
s->mb_skipped;
2504 d->mv_type=
s->mv_type;
2505 d->mv_dir=
s->mv_dir;
2507 if(
s->data_partitioning){
2509 d->tex_pb=
s->tex_pb;
2513 d->block_last_index[
i]=
s->block_last_index[
i];
2514 d->interlaced_dct=
s->interlaced_dct;
2515 d->qscale=
s->qscale;
2517 d->esc3_level_length=
s->esc3_level_length;
2522 int *dmin,
int *next_block,
int motion_x,
int motion_y)
2525 uint8_t *dest_backup[3];
2529 s->block=
s->blocks[*next_block];
2530 s->pb=
pb[*next_block];
2531 if(
s->data_partitioning){
2532 s->pb2 =
pb2 [*next_block];
2533 s->tex_pb=
tex_pb[*next_block];
2537 memcpy(dest_backup,
s->dest,
sizeof(
s->dest));
2538 s->dest[0] =
s->sc.rd_scratchpad;
2539 s->dest[1] =
s->sc.rd_scratchpad + 16*
s->linesize;
2540 s->dest[2] =
s->sc.rd_scratchpad + 16*
s->linesize + 8;
2547 if(
s->data_partitioning){
2555 score *=
s->lambda2;
2560 memcpy(
s->dest, dest_backup,
sizeof(
s->dest));
2578 else if(
w==8 &&
h==8)
2596 if(
s->mb_x*16 + 16 >
s->width )
w=
s->width -
s->mb_x*16;
2597 if(
s->mb_y*16 + 16 >
s->height)
h=
s->height-
s->mb_y*16;
2601 return s->mecc.nsse[0](
s,
s->new_picture.f->data[0] +
s->mb_x * 16 +
s->mb_y *
s->linesize * 16,
s->dest[0],
s->linesize, 16) +
2602 s->mecc.nsse[1](
s,
s->new_picture.f->data[1] +
s->mb_x * 8 +
s->mb_y *
s->uvlinesize * 8,
s->dest[1],
s->uvlinesize, 8) +
2603 s->mecc.nsse[1](
s,
s->new_picture.f->data[2] +
s->mb_x * 8 +
s->mb_y *
s->uvlinesize * 8,
s->dest[2],
s->uvlinesize, 8);
2605 return s->mecc.sse[0](
NULL,
s->new_picture.f->data[0] +
s->mb_x * 16 +
s->mb_y *
s->linesize * 16,
s->dest[0],
s->linesize, 16) +
2606 s->mecc.sse[1](
NULL,
s->new_picture.f->data[1] +
s->mb_x * 8 +
s->mb_y *
s->uvlinesize * 8,
s->dest[1],
s->uvlinesize, 8) +
2607 s->mecc.sse[1](
NULL,
s->new_picture.f->data[2] +
s->mb_x * 8 +
s->mb_y *
s->uvlinesize * 8,
s->dest[2],
s->uvlinesize, 8);
2610 return sse(
s,
s->new_picture.f->data[0] +
s->mb_x*16 +
s->mb_y*
s->linesize*16,
s->dest[0],
w,
h,
s->linesize)
2611 +
sse(
s,
s->new_picture.f->data[1] +
s->mb_x*8 +
s->mb_y*
s->uvlinesize*8,
s->dest[1],
w>>1,
h>>1,
s->uvlinesize)
2612 +
sse(
s,
s->new_picture.f->data[2] +
s->mb_x*8 +
s->mb_y*
s->uvlinesize*8,
s->dest[2],
w>>1,
h>>1,
s->uvlinesize);
2620 s->me.dia_size=
s->avctx->pre_dia_size;
2621 s->first_slice_line=1;
2622 for(
s->mb_y=
s->end_mb_y-1;
s->mb_y >=
s->start_mb_y;
s->mb_y--) {
2623 for(
s->mb_x=
s->mb_width-1;
s->mb_x >=0 ;
s->mb_x--) {
2626 s->first_slice_line=0;
2637 s->me.dia_size=
s->avctx->dia_size;
2638 s->first_slice_line=1;
2639 for(
s->mb_y=
s->start_mb_y;
s->mb_y <
s->end_mb_y;
s->mb_y++) {
2642 for(
s->mb_x=0;
s->mb_x <
s->mb_width;
s->mb_x++) {
2643 s->block_index[0]+=2;
2644 s->block_index[1]+=2;
2645 s->block_index[2]+=2;
2646 s->block_index[3]+=2;
2654 s->first_slice_line=0;
2667 uint8_t *pix =
s->new_picture.f->data[0] + (yy *
s->linesize) + xx;
2669 int sum =
s->mpvencdsp.pix_sum(pix,
s->linesize);
2671 varc = (
s->mpvencdsp.pix_norm1(pix,
s->linesize) -
2672 (((unsigned) sum * sum) >> 8) + 500 + 128) >> 8;
2674 s->current_picture.mb_var [
s->mb_stride *
mb_y +
mb_x] = varc;
2675 s->current_picture.mb_mean[
s->mb_stride *
mb_y +
mb_x] = (sum+128)>>8;
2676 s->me.mb_var_sum_temp += varc;
2684 if(
s->partitioned_frame){
2689 }
else if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) &&
2692 }
else if (CONFIG_SPEEDHQ_ENCODER &&
s->out_format ==
FMT_SPEEDHQ) {
2704 uint8_t *ptr =
s->mb_info_ptr +
s->mb_info_size - 12;
2706 int mba =
s->mb_x +
s->mb_width * (
s->mb_y %
s->gob_index);
2707 int gobn =
s->mb_y /
s->gob_index;
2709 if (CONFIG_H263_ENCODER)
2711 bytestream_put_le32(&ptr,
offset);
2712 bytestream_put_byte(&ptr,
s->qscale);
2713 bytestream_put_byte(&ptr, gobn);
2714 bytestream_put_le16(&ptr, mba);
2715 bytestream_put_byte(&ptr, pred_x);
2716 bytestream_put_byte(&ptr, pred_y);
2718 bytestream_put_byte(&ptr, 0);
2719 bytestream_put_byte(&ptr, 0);
2727 s->mb_info_size += 12;
2728 s->prev_mb_info =
s->last_mb_info;
2740 if (!
s->mb_info_size)
2741 s->mb_info_size += 12;
2748 &&
s->slice_context_count == 1
2749 &&
s->pb.buf ==
s->avctx->internal->byte_buffer) {
2750 int lastgob_pos =
s->ptr_lastgob -
s->pb.buf;
2751 int vbv_pos =
s->vbv_delay_ptr -
s->pb.buf;
2753 uint8_t *new_buffer =
NULL;
2754 int new_buffer_size = 0;
2756 if ((
s->avctx->internal->byte_buffer_size + size_increase) >= INT_MAX/8) {
2764 s->avctx->internal->byte_buffer_size + size_increase);
2768 memcpy(new_buffer,
s->avctx->internal->byte_buffer,
s->avctx->internal->byte_buffer_size);
2769 av_free(
s->avctx->internal->byte_buffer);
2770 s->avctx->internal->byte_buffer = new_buffer;
2771 s->avctx->internal->byte_buffer_size = new_buffer_size;
2773 s->ptr_lastgob =
s->pb.buf + lastgob_pos;
2774 s->vbv_delay_ptr =
s->pb.buf + vbv_pos;
2784 int chr_h= 16>>
s->chroma_y_shift;
2811 s->last_dc[
i] = 128 <<
s->intra_dc_precision;
2813 s->current_picture.encoding_error[
i] = 0;
2816 s->last_dc[0] = 128*8/13;
2817 s->last_dc[1] = 128*8/14;
2818 s->last_dc[2] = 128*8/14;
2821 memset(
s->last_mv, 0,
sizeof(
s->last_mv));
2825 switch(
s->codec_id){
2829 if (CONFIG_H263_ENCODER)
2833 if(CONFIG_MPEG4_ENCODER &&
s->partitioned_frame)
2840 s->first_slice_line = 1;
2841 s->ptr_lastgob =
s->pb.buf;
2842 for (mb_y_order =
s->start_mb_y; mb_y_order < s->
end_mb_y; mb_y_order++) {
2846 if (first_in_slice && mb_y_order !=
s->start_mb_y)
2848 s->last_dc[0] =
s->last_dc[1] =
s->last_dc[2] = 1024 <<
s->intra_dc_precision;
2864 int size_increase =
s->avctx->internal->byte_buffer_size/4
2872 if(
s->data_partitioning){
2886 xy=
s->mb_y*
s->mb_stride +
s->mb_x;
2892 int current_packet_size, is_gob_start;
2895 - (
s->ptr_lastgob -
s->pb.buf);
2897 is_gob_start =
s->rtp_payload_size &&
2898 current_packet_size >=
s->rtp_payload_size &&
2901 if(
s->start_mb_y ==
mb_y &&
mb_y > 0 &&
mb_x==0) is_gob_start=1;
2903 switch(
s->codec_id){
2906 if(!
s->h263_slice_structured)
2907 if(
s->mb_x ||
s->mb_y%
s->gob_index) is_gob_start=0;
2910 if(
s->mb_x==0 &&
s->mb_y!=0) is_gob_start=1;
2912 if(
s->mb_skip_run) is_gob_start=0;
2915 if(
s->mb_x==0 &&
s->mb_y!=0) is_gob_start=1;
2931 if (
s->error_rate &&
s->resync_mb_x +
s->resync_mb_y > 0) {
2933 int d = 100 /
s->error_rate;
2935 current_packet_size=0;
2936 s->pb.buf_ptr=
s->ptr_lastgob;
2943 switch(
s->codec_id){
2945 if (CONFIG_MPEG4_ENCODER) {
2952 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER) {
2959 if (CONFIG_H263_ENCODER)
2966 s->misc_bits+=
bits -
s->last_bits;
2970 s->ptr_lastgob += current_packet_size;
2971 s->first_slice_line=1;
2972 s->resync_mb_x=
mb_x;
2973 s->resync_mb_y=
mb_y;
2977 if( (
s->resync_mb_x ==
s->mb_x)
2978 &&
s->resync_mb_y+1 ==
s->mb_y){
2979 s->first_slice_line=0;
2989 int pb_bits_count, pb2_bits_count, tex_pb_bits_count;
2995 if(
s->data_partitioning){
2996 backup_s.pb2=
s->pb2;
2997 backup_s.tex_pb=
s->tex_pb;
3004 s->mv[0][0][0] =
s->p_mv_table[xy][0];
3005 s->mv[0][0][1] =
s->p_mv_table[xy][1];
3007 &dmin, &next_block,
s->mv[0][0][0],
s->mv[0][0][1]);
3014 j=
s->field_select[0][
i] =
s->p_field_select_table[
i][xy];
3015 s->mv[0][
i][0] =
s->p_field_mv_table[
i][j][xy][0];
3016 s->mv[0][
i][1] =
s->p_field_mv_table[
i][j][xy][1];
3019 &dmin, &next_block, 0, 0);
3028 &dmin, &next_block,
s->mv[0][0][0],
s->mv[0][0][1]);
3035 s->mv[0][
i][0] =
s->current_picture.motion_val[0][
s->block_index[
i]][0];
3036 s->mv[0][
i][1] =
s->current_picture.motion_val[0][
s->block_index[
i]][1];
3039 &dmin, &next_block, 0, 0);
3045 s->mv[0][0][0] =
s->b_forw_mv_table[xy][0];
3046 s->mv[0][0][1] =
s->b_forw_mv_table[xy][1];
3048 &dmin, &next_block,
s->mv[0][0][0],
s->mv[0][0][1]);
3054 s->mv[1][0][0] =
s->b_back_mv_table[xy][0];
3055 s->mv[1][0][1] =
s->b_back_mv_table[xy][1];
3057 &dmin, &next_block,
s->mv[1][0][0],
s->mv[1][0][1]);
3063 s->mv[0][0][0] =
s->b_bidir_forw_mv_table[xy][0];
3064 s->mv[0][0][1] =
s->b_bidir_forw_mv_table[xy][1];
3065 s->mv[1][0][0] =
s->b_bidir_back_mv_table[xy][0];
3066 s->mv[1][0][1] =
s->b_bidir_back_mv_table[xy][1];
3068 &dmin, &next_block, 0, 0);
3075 j=
s->field_select[0][
i] =
s->b_field_select_table[0][
i][xy];
3076 s->mv[0][
i][0] =
s->b_field_mv_table[0][
i][j][xy][0];
3077 s->mv[0][
i][1] =
s->b_field_mv_table[0][
i][j][xy][1];
3080 &dmin, &next_block, 0, 0);
3087 j=
s->field_select[1][
i] =
s->b_field_select_table[1][
i][xy];
3088 s->mv[1][
i][0] =
s->b_field_mv_table[1][
i][j][xy][0];
3089 s->mv[1][
i][1] =
s->b_field_mv_table[1][
i][j][xy][1];
3092 &dmin, &next_block, 0, 0);
3098 for(dir=0; dir<2; dir++){
3100 j=
s->field_select[dir][
i] =
s->b_field_select_table[dir][
i][xy];
3101 s->mv[dir][
i][0] =
s->b_field_mv_table[dir][
i][j][xy][0];
3102 s->mv[dir][
i][1] =
s->b_field_mv_table[dir][
i][j][xy][1];
3106 &dmin, &next_block, 0, 0);
3115 &dmin, &next_block, 0, 0);
3116 if(
s->h263_pred ||
s->h263_aic){
3118 s->mbintra_table[
mb_x +
mb_y*
s->mb_stride]=1;
3126 const int last_qp= backup_s.qscale;
3130 static const int dquant_tab[4]={-1,1,-2,2};
3131 int storecoefs =
s->mb_intra &&
s->dc_val[0];
3139 s->mv[0][0][0] = best_s.
mv[0][0][0];
3140 s->mv[0][0][1] = best_s.
mv[0][0][1];
3141 s->mv[1][0][0] = best_s.
mv[1][0][0];
3142 s->mv[1][0][1] = best_s.
mv[1][0][1];
3145 for(; qpi<4; qpi++){
3146 int dquant= dquant_tab[qpi];
3148 if(qp < s->
avctx->
qmin || qp >
s->avctx->qmax)
3153 dc[
i]=
s->dc_val[0][
s->block_index[
i] ];
3154 memcpy(ac[
i],
s->ac_val[0][
s->block_index[
i]],
sizeof(int16_t)*16);
3159 &dmin, &next_block,
s->mv[mvdir][0][0],
s->mv[mvdir][0][1]);
3163 s->dc_val[0][
s->block_index[
i] ]=
dc[
i];
3164 memcpy(
s->ac_val[0][
s->block_index[
i]], ac[
i],
sizeof(int16_t)*16);
3172 int mx=
s->b_direct_mv_table[xy][0];
3173 int my=
s->b_direct_mv_table[xy][1];
3175 backup_s.dquant = 0;
3180 &dmin, &next_block, mx, my);
3183 backup_s.dquant = 0;
3188 &dmin, &next_block, 0, 0);
3193 coded |=
s->block_last_index[
i];
3196 memcpy(
s->mv, best_s.
mv,
sizeof(
s->mv));
3218 &dmin, &next_block, mx, my);
3223 s->current_picture.qscale_table[xy] = best_s.
qscale;
3229 ff_copy_bits(&backup_s.pb, bit_buf[next_block^1], pb_bits_count);
3232 if(
s->data_partitioning){
3235 ff_copy_bits(&backup_s.pb2, bit_buf2[next_block^1], pb2_bits_count);
3236 s->pb2= backup_s.pb2;
3240 ff_copy_bits(&backup_s.tex_pb, bit_buf_tex[next_block^1], tex_pb_bits_count);
3241 s->tex_pb= backup_s.tex_pb;
3245 if (CONFIG_H263_ENCODER &&
3250 s->hdsp.put_pixels_tab[0][0](
s->dest[0],
s->sc.rd_scratchpad ,
s->linesize ,16);
3251 s->hdsp.put_pixels_tab[1][0](
s->dest[1],
s->sc.rd_scratchpad + 16*
s->linesize ,
s->uvlinesize, 8);
3252 s->hdsp.put_pixels_tab[1][0](
s->dest[2],
s->sc.rd_scratchpad + 16*
s->linesize + 8,
s->uvlinesize, 8);
3258 int motion_x = 0, motion_y = 0;
3266 motion_x=
s->mv[0][0][0] = 0;
3267 motion_y=
s->mv[0][0][1] = 0;
3272 motion_x=
s->mv[0][0][0] =
s->p_mv_table[xy][0];
3273 motion_y=
s->mv[0][0][1] =
s->p_mv_table[xy][1];
3280 j=
s->field_select[0][
i] =
s->p_field_select_table[
i][xy];
3281 s->mv[0][
i][0] =
s->p_field_mv_table[
i][j][xy][0];
3282 s->mv[0][
i][1] =
s->p_field_mv_table[
i][j][xy][1];
3290 s->mv[0][
i][0] =
s->current_picture.motion_val[0][
s->block_index[
i]][0];
3291 s->mv[0][
i][1] =
s->current_picture.motion_val[0][
s->block_index[
i]][1];
3295 if (CONFIG_MPEG4_ENCODER) {
3298 motion_x=
s->b_direct_mv_table[xy][0];
3299 motion_y=
s->b_direct_mv_table[xy][1];
3304 if (CONFIG_MPEG4_ENCODER) {
3313 s->mv[0][0][0] =
s->b_bidir_forw_mv_table[xy][0];
3314 s->mv[0][0][1] =
s->b_bidir_forw_mv_table[xy][1];
3315 s->mv[1][0][0] =
s->b_bidir_back_mv_table[xy][0];
3316 s->mv[1][0][1] =
s->b_bidir_back_mv_table[xy][1];
3321 motion_x=
s->mv[1][0][0] =
s->b_back_mv_table[xy][0];
3322 motion_y=
s->mv[1][0][1] =
s->b_back_mv_table[xy][1];
3327 motion_x=
s->mv[0][0][0] =
s->b_forw_mv_table[xy][0];
3328 motion_y=
s->mv[0][0][1] =
s->b_forw_mv_table[xy][1];
3335 j=
s->field_select[0][
i] =
s->b_field_select_table[0][
i][xy];
3336 s->mv[0][
i][0] =
s->b_field_mv_table[0][
i][j][xy][0];
3337 s->mv[0][
i][1] =
s->b_field_mv_table[0][
i][j][xy][1];
3345 j=
s->field_select[1][
i] =
s->b_field_select_table[1][
i][xy];
3346 s->mv[1][
i][0] =
s->b_field_mv_table[1][
i][j][xy][0];
3347 s->mv[1][
i][1] =
s->b_field_mv_table[1][
i][j][xy][1];
3354 for(dir=0; dir<2; dir++){
3356 j=
s->field_select[dir][
i] =
s->b_field_select_table[dir][
i][xy];
3357 s->mv[dir][
i][0] =
s->b_field_mv_table[dir][
i][j][xy][0];
3358 s->mv[dir][
i][1] =
s->b_field_mv_table[dir][
i][j][xy][1];
3369 s->last_mv_dir =
s->mv_dir;
3371 if (CONFIG_H263_ENCODER &&
3380 s->p_mv_table[xy][0]=0;
3381 s->p_mv_table[xy][1]=0;
3388 if(
s->mb_x*16 + 16 >
s->width )
w=
s->width -
s->mb_x*16;
3389 if(
s->mb_y*16 + 16 >
s->height)
h=
s->height-
s->mb_y*16;
3391 s->current_picture.encoding_error[0] +=
sse(
3392 s,
s->new_picture.f->data[0] +
s->mb_x*16 +
s->mb_y*
s->linesize*16,
3393 s->dest[0],
w,
h,
s->linesize);
3394 s->current_picture.encoding_error[1] +=
sse(
3395 s,
s->new_picture.f->data[1] +
s->mb_x*8 +
s->mb_y*
s->uvlinesize*chr_h,
3396 s->dest[1],
w>>1,
h>>
s->chroma_y_shift,
s->uvlinesize);
3397 s->current_picture.encoding_error[2] +=
sse(
3398 s,
s->new_picture.f->data[2] +
s->mb_x*8 +
s->mb_y*
s->uvlinesize*chr_h,
3399 s->dest[2],
w>>1,
h>>
s->chroma_y_shift,
s->uvlinesize);
3402 if(CONFIG_H263_ENCODER &&
s->out_format ==
FMT_H263)
3405 ff_dlog(
s->avctx,
"MB %d %d bits\n",
3419 #define MERGE(field) dst->field += src->field; src->field=0
3446 for(
i=0;
i<64;
i++){
3459 if (
s->next_lambda){
3460 s->current_picture_ptr->f->quality =
3461 s->current_picture.f->quality =
s->next_lambda;
3462 if(!dry_run)
s->next_lambda= 0;
3463 }
else if (!
s->fixed_qscale) {
3465 s->current_picture_ptr->f->quality =
3466 s->current_picture.f->quality =
quality;
3467 if (
s->current_picture.f->quality < 0)
3471 if(
s->adaptive_quant){
3472 switch(
s->codec_id){
3474 if (CONFIG_MPEG4_ENCODER)
3480 if (CONFIG_H263_ENCODER)
3487 s->lambda=
s->lambda_table[0];
3490 s->lambda =
s->current_picture.f->quality;
3498 s->time =
s->current_picture_ptr->f->pts *
s->avctx->time_base.num;
3501 s->pb_time=
s->pp_time - (
s->last_non_b_time -
s->time);
3504 s->pp_time=
s->time -
s->last_non_b_time;
3505 s->last_non_b_time=
s->time;
3514 int context_count =
s->slice_context_count;
3519 s->me.mb_var_sum_temp =
3520 s->me.mc_mb_var_sum_temp = 0;
3524 if (
s->out_format ==
FMT_MPEG1 || (
s->h263_pred && !
s->msmpeg4_version))
3529 s->me.scene_change_score=0;
3534 if(
s->msmpeg4_version >= 3)
s->no_rounding=1;
3535 else s->no_rounding=0;
3538 s->no_rounding ^= 1;
3547 s->lambda=
s->last_lambda_for[
s->pict_type];
3549 s->lambda=
s->last_lambda_for[
s->last_non_b_pict_type];
3554 if(
s->q_chroma_intra_matrix !=
s->q_intra_matrix )
av_freep(&
s->q_chroma_intra_matrix);
3555 if(
s->q_chroma_intra_matrix16 !=
s->q_intra_matrix16)
av_freep(&
s->q_chroma_intra_matrix16);
3556 s->q_chroma_intra_matrix =
s->q_intra_matrix;
3557 s->q_chroma_intra_matrix16 =
s->q_intra_matrix16;
3561 for(
i=1;
i<context_count;
i++){
3572 s->lambda = (
s->lambda *
s->me_penalty_compensation + 128) >> 8;
3573 s->lambda2 = (
s->lambda2 * (int64_t)
s->me_penalty_compensation + 128) >> 8;
3584 for(
i=0;
i<
s->mb_stride*
s->mb_height;
i++)
3587 if(!
s->fixed_qscale){
3589 s->avctx->execute(
s->avctx,
mb_var_thread, &
s->thread_context[0],
NULL, context_count,
sizeof(
void*));
3592 for(
i=1;
i<context_count;
i++){
3595 s->current_picture.mc_mb_var_sum=
s->current_picture_ptr->mc_mb_var_sum=
s->me.mc_mb_var_sum_temp;
3596 s->current_picture. mb_var_sum=
s->current_picture_ptr-> mb_var_sum=
s->me. mb_var_sum_temp;
3599 if (
s->me.scene_change_score >
s->scenechange_threshold &&
3602 for(
i=0;
i<
s->mb_stride*
s->mb_height;
i++)
3604 if(
s->msmpeg4_version >= 3)
3606 ff_dlog(
s,
"Scene change detected, encoding as I Frame %"PRId64
" %"PRId64
"\n",
3607 s->current_picture.mb_var_sum,
s->current_picture.mc_mb_var_sum);
3650 for(dir=0; dir<2; dir++){
3656 s->b_field_mv_table[dir][
i][j], dir ?
s->b_code :
s->f_code,
type, 1);
3667 if (
s->qscale < 3 &&
s->max_qcoeff <= 128 &&
3676 if (
s->avctx->intra_matrix) {
3678 luma_matrix =
s->avctx->intra_matrix;
3680 if (
s->avctx->chroma_intra_matrix)
3681 chroma_matrix =
s->avctx->chroma_intra_matrix;
3685 int j =
s->idsp.idct_permutation[
i];
3687 s->chroma_intra_matrix[j] =
av_clip_uint8((chroma_matrix[
i] *
s->qscale) >> 3);
3690 s->y_dc_scale_table=
3692 s->chroma_intra_matrix[0] =
3695 s->intra_matrix,
s->intra_quant_bias, 8, 8, 1);
3697 s->chroma_intra_matrix,
s->intra_quant_bias, 8, 8, 1);
3701 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};
3702 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};
3703 for (
int i = 1;
i < 64;
i++) {
3709 s->y_dc_scale_table = y;
3710 s->c_dc_scale_table =
c;
3711 s->intra_matrix[0] = 13;
3712 s->chroma_intra_matrix[0] = 14;
3714 s->intra_matrix,
s->intra_quant_bias, 8, 8, 1);
3716 s->chroma_intra_matrix,
s->intra_quant_bias, 8, 8, 1);
3720 s->y_dc_scale_table=
3725 s->current_picture_ptr->f->key_frame =
3727 s->current_picture_ptr->f->pict_type =
3728 s->current_picture.f->pict_type =
s->pict_type;
3730 if (
s->current_picture.f->key_frame)
3731 s->picture_in_gop_number=0;
3733 s->mb_x =
s->mb_y = 0;
3735 switch(
s->out_format) {
3736 #if CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER
3741 s->pred,
s->intra_matrix,
s->chroma_intra_matrix);
3745 if (CONFIG_SPEEDHQ_ENCODER)
3749 if (CONFIG_H261_ENCODER)
3757 else if (CONFIG_MPEG4_ENCODER &&
s->h263_pred) {
3770 else if (CONFIG_H263_ENCODER)
3774 if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
3781 s->header_bits=
bits -
s->last_bits;
3783 for(
i=1;
i<context_count;
i++){
3786 s->avctx->execute(
s->avctx,
encode_thread, &
s->thread_context[0],
NULL, context_count,
sizeof(
void*));
3787 for(
i=1;
i<context_count;
i++){
3788 if (
s->pb.buf_end ==
s->thread_context[
i]->pb.buf)
3797 const int intra=
s->mb_intra;
3800 s->dct_count[intra]++;
3802 for(
i=0;
i<64;
i++){
3807 s->dct_error_sum[intra][
i] +=
level;
3808 level -=
s->dct_offset[intra][
i];
3811 s->dct_error_sum[intra][
i] -=
level;
3812 level +=
s->dct_offset[intra][
i];
3821 int16_t *
block,
int n,
3824 const uint16_t *matrix;
3825 const uint8_t *scantable;
3826 const uint8_t *perm_scantable;
3828 unsigned int threshold1, threshold2;
3840 int coeff_count[64];
3841 int qmul, qadd, start_i, last_non_zero,
i,
dc;
3842 const int esc_length=
s->ac_esc_length;
3844 uint8_t * last_length;
3850 if(
s->dct_error_sum)
3856 else mpeg2_qscale =
qscale << 1;
3860 scantable=
s->intra_scantable.scantable;
3861 perm_scantable=
s->intra_scantable.permutated;
3878 qmat = n < 4 ?
s->q_intra_matrix[
qscale] :
s->q_chroma_intra_matrix[
qscale];
3879 matrix = n < 4 ?
s->intra_matrix :
s->chroma_intra_matrix;
3883 if (n > 3 &&
s->intra_chroma_ac_vlc_length) {
3884 length =
s->intra_chroma_ac_vlc_length;
3885 last_length=
s->intra_chroma_ac_vlc_last_length;
3887 length =
s->intra_ac_vlc_length;
3888 last_length=
s->intra_ac_vlc_last_length;
3891 scantable=
s->inter_scantable.scantable;
3892 perm_scantable=
s->inter_scantable.permutated;
3895 qmat =
s->q_inter_matrix[
qscale];
3896 matrix =
s->inter_matrix;
3897 length =
s->inter_ac_vlc_length;
3898 last_length=
s->inter_ac_vlc_last_length;
3903 threshold2= (threshold1<<1);
3905 for(
i=63;
i>=start_i;
i--) {
3906 const int j = scantable[
i];
3909 if(((
unsigned)(
level+threshold1))>threshold2){
3915 for(
i=start_i;
i<=last_non_zero;
i++) {
3916 const int j = scantable[
i];
3921 if(((
unsigned)(
level+threshold1))>threshold2){
3944 if(last_non_zero < start_i){
3945 memset(
block + start_i, 0, (64-start_i)*
sizeof(int16_t));
3946 return last_non_zero;
3949 score_tab[start_i]= 0;
3950 survivor[0]= start_i;
3953 for(
i=start_i;
i<=last_non_zero;
i++){
3954 int level_index, j, zero_distortion;
3956 int best_score=256*256*256*120;
3960 zero_distortion= dct_coeff*dct_coeff;
3962 for(level_index=0; level_index < coeff_count[
i]; level_index++){
3971 unquant_coeff= alevel*qmul + qadd;
3973 j =
s->idsp.idct_permutation[scantable[
i]];
3974 unquant_coeff = alevel * matrix[j] * 8;
3976 j =
s->idsp.idct_permutation[scantable[
i]];
3978 unquant_coeff = (
int)( alevel * mpeg2_qscale * matrix[j]) >> 4;
3979 unquant_coeff = (unquant_coeff - 1) | 1;
3981 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((
int) matrix[j])) >> 5;
3982 unquant_coeff = (unquant_coeff - 1) | 1;
3987 distortion= (unquant_coeff - dct_coeff) * (unquant_coeff - dct_coeff) - zero_distortion;
3989 if((
level&(~127)) == 0){
3990 for(j=survivor_count-1; j>=0; j--){
3991 int run=
i - survivor[j];
3993 score += score_tab[
i-
run];
3995 if(score < best_score){
3998 level_tab[
i+1]=
level-64;
4003 for(j=survivor_count-1; j>=0; j--){
4004 int run=
i - survivor[j];
4006 score += score_tab[
i-
run];
4007 if(score < last_score){
4010 last_level=
level-64;
4016 distortion += esc_length*
lambda;
4017 for(j=survivor_count-1; j>=0; j--){
4018 int run=
i - survivor[j];
4019 int score= distortion + score_tab[
i-
run];
4021 if(score < best_score){
4024 level_tab[
i+1]=
level-64;
4029 for(j=survivor_count-1; j>=0; j--){
4030 int run=
i - survivor[j];
4031 int score= distortion + score_tab[
i-
run];
4032 if(score < last_score){
4035 last_level=
level-64;
4043 score_tab[
i+1]= best_score;
4046 if(last_non_zero <= 27){
4047 for(; survivor_count; survivor_count--){
4048 if(score_tab[ survivor[survivor_count-1] ] <= best_score)
4052 for(; survivor_count; survivor_count--){
4053 if(score_tab[ survivor[survivor_count-1] ] <= best_score +
lambda)
4058 survivor[ survivor_count++ ]=
i+1;
4062 last_score= 256*256*256*120;
4063 for(
i= survivor[0];
i<=last_non_zero + 1;
i++){
4064 int score= score_tab[
i];
4068 if(score < last_score){
4071 last_level= level_tab[
i];
4072 last_run= run_tab[
i];
4077 s->coded_score[n] = last_score;
4080 last_non_zero= last_i - 1;
4081 memset(
block + start_i, 0, (64-start_i)*
sizeof(int16_t));
4083 if(last_non_zero < start_i)
4084 return last_non_zero;
4086 if(last_non_zero == 0 && start_i == 0){
4088 int best_score=
dc *
dc;
4090 for(
i=0;
i<coeff_count[0];
i++){
4093 int unquant_coeff, score, distortion;
4096 unquant_coeff= (alevel*qmul + qadd)>>3;
4098 unquant_coeff = ((( alevel << 1) + 1) * mpeg2_qscale * ((
int) matrix[0])) >> 5;
4099 unquant_coeff = (unquant_coeff - 1) | 1;
4101 unquant_coeff = (unquant_coeff + 4) >> 3;
4102 unquant_coeff<<= 3 + 3;
4104 distortion= (unquant_coeff -
dc) * (unquant_coeff -
dc);
4107 else score= distortion + esc_length*
lambda;
4109 if(score < best_score){
4111 best_level=
level - 64;
4114 block[0]= best_level;
4115 s->coded_score[n] = best_score -
dc*
dc;
4116 if(best_level == 0)
return -1;
4117 else return last_non_zero;
4123 block[ perm_scantable[last_non_zero] ]= last_level;
4126 for(;
i>start_i;
i -= run_tab[
i] + 1){
4127 block[ perm_scantable[
i-1] ]= level_tab[
i];
4130 return last_non_zero;
4145 if(
i==0)
s*= sqrt(0.5);
4146 if(j==0)
s*= sqrt(0.5);
4159 const uint8_t *scantable;
4160 const uint8_t *perm_scantable;
4166 int qmul, qadd, start_i, last_non_zero,
i,
dc;
4168 uint8_t * last_length;
4170 int rle_index,
run, q = 1, sum;
4172 if(
basis[0][0] == 0)
4178 scantable=
s->intra_scantable.scantable;
4179 perm_scantable=
s->intra_scantable.permutated;
4197 if (n > 3 &&
s->intra_chroma_ac_vlc_length) {
4198 length =
s->intra_chroma_ac_vlc_length;
4199 last_length=
s->intra_chroma_ac_vlc_last_length;
4201 length =
s->intra_ac_vlc_length;
4202 last_length=
s->intra_ac_vlc_last_length;
4205 scantable=
s->inter_scantable.scantable;
4206 perm_scantable=
s->inter_scantable.permutated;
4209 length =
s->inter_ac_vlc_length;
4210 last_length=
s->inter_ac_vlc_last_length;
4212 last_non_zero =
s->block_last_index[n];
4215 for(
i=0;
i<64;
i++){
4220 for(
i=0;
i<64;
i++){
4226 w= 15 + (48*qns*one +
w/2)/
w;
4239 for(
i=start_i;
i<=last_non_zero;
i++){
4240 int j= perm_scantable[
i];
4247 run_tab[rle_index++]=
run;
4257 int best_score =
s->mpvencdsp.try_8x8basis(rem,
weight,
basis[0], 0);
4260 int run2, best_unquant_change=0, analyze_gradient;
4261 analyze_gradient = last_non_zero > 2 ||
s->quantizer_noise_shaping >= 3;
4263 if(analyze_gradient){
4264 for(
i=0;
i<64;
i++){
4274 int change, old_coeff;
4280 for(change=-1; change<=1; change+=2){
4281 int new_level=
level + change;
4282 int score, new_coeff;
4284 new_coeff= q*new_level;
4285 if(new_coeff >= 2048 || new_coeff < 0)
4288 score =
s->mpvencdsp.try_8x8basis(rem,
weight,
basis[0],
4289 new_coeff - old_coeff);
4290 if(score<best_score){
4293 best_change= change;
4294 best_unquant_change= new_coeff - old_coeff;
4301 run2= run_tab[rle_index++];
4305 for(
i=start_i;
i<64;
i++){
4306 int j= perm_scantable[
i];
4308 int change, old_coeff;
4310 if(
s->quantizer_noise_shaping < 3 &&
i > last_non_zero + 1)
4315 else old_coeff= qmul*
level + qadd;
4316 run2= run_tab[rle_index++];
4323 for(change=-1; change<=1; change+=2){
4324 int new_level=
level + change;
4325 int score, new_coeff, unquant_change;
4332 if(new_level<0) new_coeff= qmul*new_level - qadd;
4333 else new_coeff= qmul*new_level + qadd;
4334 if(new_coeff >= 2048 || new_coeff <= -2048)
4339 if(level < 63 && level > -63){
4340 if(
i < last_non_zero)
4350 if(analyze_gradient){
4351 int g= d1[ scantable[
i] ];
4352 if(
g && (
g^new_level) >= 0)
4356 if(
i < last_non_zero){
4357 int next_i=
i + run2 + 1;
4358 int next_level=
block[ perm_scantable[next_i] ] + 64;
4360 if(next_level&(~127))
4363 if(next_i < last_non_zero)
4383 if(
i < last_non_zero){
4384 int next_i=
i + run2 + 1;
4385 int next_level=
block[ perm_scantable[next_i] ] + 64;
4387 if(next_level&(~127))
4390 if(next_i < last_non_zero)
4409 unquant_change= new_coeff - old_coeff;
4412 score +=
s->mpvencdsp.try_8x8basis(rem,
weight,
basis[j],
4414 if(score<best_score){
4417 best_change= change;
4418 best_unquant_change= unquant_change;
4422 prev_level=
level + 64;
4423 if(prev_level&(~127))
4433 int j= perm_scantable[ best_coeff ];
4435 block[j] += best_change;
4437 if(best_coeff > last_non_zero){
4438 last_non_zero= best_coeff;
4441 for(; last_non_zero>=start_i; last_non_zero--){
4442 if(
block[perm_scantable[last_non_zero]])
4449 for(
i=start_i;
i<=last_non_zero;
i++){
4450 int j= perm_scantable[
i];
4454 run_tab[rle_index++]=
run;
4461 s->mpvencdsp.add_8x8basis(rem,
basis[j], best_unquant_change);
4467 return last_non_zero;
4482 const uint8_t *scantable,
int last)
4493 for (
i = 0;
i <= last;
i++) {
4494 const int j = scantable[
i];
4499 for (
i = 0;
i <= last;
i++) {
4500 const int j = scantable[
i];
4501 const int perm_j = permutation[j];
4507 int16_t *
block,
int n,
4510 int i, j,
level, last_non_zero, q, start_i;
4512 const uint8_t *scantable;
4515 unsigned int threshold1, threshold2;
4519 if(
s->dct_error_sum)
4523 scantable=
s->intra_scantable.scantable;
4538 qmat = n < 4 ?
s->q_intra_matrix[
qscale] :
s->q_chroma_intra_matrix[
qscale];
4541 scantable=
s->inter_scantable.scantable;
4544 qmat =
s->q_inter_matrix[
qscale];
4548 threshold2= (threshold1<<1);
4549 for(
i=63;
i>=start_i;
i--) {
4553 if(((
unsigned)(
level+threshold1))>threshold2){
4560 for(
i=start_i;
i<=last_non_zero;
i++) {
4566 if(((
unsigned)(
level+threshold1))>threshold2){
4584 scantable, last_non_zero);
4586 return last_non_zero;
4589 #define OFFSET(x) offsetof(MpegEncContext, x)
4590 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
4593 {
"mb_info",
"emit macroblock info for RFC 2190 packetization, the parameter value is the maximum payload size",
OFFSET(
mb_info),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
4595 #if FF_API_MPEGVIDEO_OPTS
4631 #if FF_API_MPEGVIDEO_OPTS
4662 .
name =
"msmpeg4v2",
#define FF_ALLOCZ_TYPED_ARRAY(p, nelem)
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
#define FF_MPV_DEPRECATED_A53_CC_OPT
void ff_speedhq_end_slice(MpegEncContext *s)
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
int ff_wmv2_encode_picture_header(MpegEncContext *s, int picture_number)
uint16_t * mb_type
Table for candidate MB types for encoding (defines in mpegutils.h)
#define MV_TYPE_16X16
1 vector for the whole mb
#define AV_LOG_WARNING
Something somehow does not look correct.
static void direct(const float *in, const FFTComplex *ir, int len, float *out)
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
av_cold int ff_speedhq_encode_init(MpegEncContext *s)
AVPixelFormat
Pixel format.
const AVClass ff_mpv_enc_class
int data_partitioning
data partitioning flag from header
static void set_frame_distances(MpegEncContext *s)
int avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
Read encoded data from the encoder.
unsigned int lambda
Lagrange multiplier used in rate distortion.
#define H263_GOB_HEIGHT(h)
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 ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
int b_code
backward MV resolution for B-frames (MPEG-4)
void ff_mpeg4_merge_partitions(MpegEncContext *s)
void ff_mpv_common_defaults(MpegEncContext *s)
Set the given MpegEncContext to common defaults (same for encoding and decoding).
int av_frame_get_buffer(AVFrame *frame, int align)
Allocate new buffer(s) for audio or video data.
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
int64_t rc_min_rate
minimum bitrate
void ff_fix_long_p_mvs(MpegEncContext *s, int type)
void ff_speedhq_encode_picture_header(MpegEncContext *s)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AVERROR_EOF
End of file.
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
static av_always_inline void encode_mb(MpegEncContext *s, int motion_x, int motion_y)
#define AV_CODEC_FLAG_QSCALE
Use fixed qscale.
static int sse_mb(MpegEncContext *s)
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
void ff_block_permute(int16_t *block, uint8_t *permutation, const uint8_t *scantable, int last)
Permute an 8x8 block according to permutation.
av_cold void ff_qpeldsp_init(QpelDSPContext *c)
static int16_t basis[64][64]
void ff_mjpeg_encode_picture_header(AVCodecContext *avctx, PutBitContext *pb, ScanTable *intra_scantable, int pred, uint16_t luma_intra_matrix[64], uint16_t chroma_intra_matrix[64])
uint16_t * intra_matrix
custom intra quantization matrix Must be allocated with the av_malloc() family of functions,...
Picture current_picture
copy of the current picture structure.
static const uint8_t mv_bits[2][16][10]
static int estimate_motion_thread(AVCodecContext *c, void *arg)
float lumi_masking
luminance masking (0-> disabled)
static void update_noise_reduction(MpegEncContext *s)
#define MV_DIRECT
bidirectional mode where the difference equals the MV of the last P/S/I-Frame (MPEG-4)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
const AVCodec * avcodec_find_encoder(enum AVCodecID id)
Find a registered encoder with a matching codec ID.
int partitioned_frame
is current frame partitioned
uint16_t(* dct_offset)[64]
const AVCodec ff_h263p_encoder
#define UNI_AC_ENC_INDEX(run, level)
This structure describes decoded (raw) audio or video data.
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
void ff_msmpeg4_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
#define CANDIDATE_MB_TYPE_INTER_I
static const int BUF_BITS
void ff_free_picture_tables(Picture *pic)
static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
int av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Shrink the already allocated side data buffer.
static int put_bytes_count(const PutBitContext *s, int round_up)
#define CANDIDATE_MB_TYPE_BACKWARD_I
const uint8_t ff_mpeg2_non_linear_qscale[32]
av_cold int ff_mjpeg_encode_init(MpegEncContext *s)
void ff_clean_intra_table_entries(MpegEncContext *s)
Clean dc, ac, coded_block for the current non-intra MB.
#define AV_LOG_VERBOSE
Detailed information.
#define PICT_BOTTOM_FIELD
av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx)
void ff_h261_encode_init(MpegEncContext *s)
void ff_init_block_index(MpegEncContext *s)
struct AVCodecContext * avctx
void ff_rv20_encode_picture_header(MpegEncContext *s, int picture_number)
av_cold int ff_rate_control_init(MpegEncContext *s)
#define AV_CODEC_FLAG_PSNR
error[?] variables will be set during encoding.
#define CANDIDATE_MB_TYPE_SKIPPED
static int pre_estimate_motion_thread(AVCodecContext *c, void *arg)
PutBitContext pb
bit output
int mb_decision
macroblock decision mode
#define CANDIDATE_MB_TYPE_INTER
AVCPBProperties * ff_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context.
int qmax
maximum quantizer
#define AV_CODEC_FLAG_INTERLACED_ME
interlaced motion estimation
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
#define AV_CODEC_FLAG_4MV
4 MV per MB allowed / advanced prediction for H.263.
void ff_set_cmp(MECmpContext *c, me_cmp_func *cmp, int type)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
void ff_msmpeg4_encode_picture_header(MpegEncContext *s, int picture_number)
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
int mv[2][4][2]
motion vectors for a macroblock first coordinate : 0 = forward 1 = backward second " : depend...
#define FF_MPV_FLAG_SKIP_RD
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
#define CANDIDATE_MB_TYPE_FORWARD_I
void ff_mpeg1_encode_picture_header(MpegEncContext *s, int picture_number)
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic_arg, int *got_packet)
void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
Copy the content of src to the bitstream.
static int estimate_qp(MpegEncContext *s, int dry_run)
int ff_get_best_fcode(MpegEncContext *s, int16_t(*mv_table)[2], int type)
void ff_set_mpeg4_time(MpegEncContext *s)
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
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.
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.
const struct AVCodec * codec
static void merge_context_after_me(MpegEncContext *dst, MpegEncContext *src)
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
#define CANDIDATE_MB_TYPE_BIDIR
int padding_bug_score
used to detect the VERY common padding bug in MPEG-4
static const struct twinvq_data tab
static int get_intra_count(MpegEncContext *s, uint8_t *src, uint8_t *ref, int stride)
av_cold void ff_me_cmp_init(MECmpContext *c, AVCodecContext *avctx)
av_cold void ff_h263dsp_init(H263DSPContext *ctx)
int flags
AV_CODEC_FLAG_*.
int bit_rate_tolerance
number of bits the bitstream is allowed to diverge from the reference.
int umvplus
== H.263+ && unrestricted_mv
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
static av_always_inline float scale(float x, float s)
void ff_h263_update_motion_val(MpegEncContext *s)
#define AV_CODEC_FLAG_LOOP_FILTER
loop filter.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
static void mpv_encode_init_static(void)
#define CANDIDATE_MB_TYPE_INTER4V
static const AVOption h263_options[]
static int put_bytes_left(const PutBitContext *s, int round_up)
#define MAX_PICTURE_COUNT
av_cold int ff_dct_encode_init(MpegEncContext *s)
void ff_mpeg4_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
int ff_mpv_reallocate_putbitbuffer(MpegEncContext *s, size_t threshold, size_t size_increase)
void ff_mjpeg_encode_mb(MpegEncContext *s, int16_t block[12][64])
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
float ff_rate_estimate_qscale(MpegEncContext *s, int dry_run)
int ff_mpeg4_encode_picture_header(MpegEncContext *s, int picture_number)
void ff_mpv_common_end(MpegEncContext *s)
static int frame_start(MpegEncContext *s)
static int ff_thread_once(char *control, void(*routine)(void))
void ff_init_qscale_tab(MpegEncContext *s)
init s->current_picture.qscale_table from s->lambda_table
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define FF_ARRAY_ELEMS(a)
static void update_mb_info(MpegEncContext *s, int startcode)
av_cold void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx)
int ff_h261_get_picture_format(int width, int height)
static uint8_t default_fcode_tab[MAX_MV *2+1]
int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my)
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
static void build_basis(uint8_t *perm)
int has_b_frames
Size of the frame reordering buffer in the decoder.
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
void ff_h263_encode_init(MpegEncContext *s)
const uint8_t ff_h263_chroma_qscale_table[32]
static void rebase_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Rebase the bit writer onto a reallocated buffer.
static int encode_frame(AVCodecContext *c, AVFrame *frame, AVPacket *pkt)
void ff_mpeg_unref_picture(AVCodecContext *avctx, Picture *pic)
Deallocate a picture.
const uint8_t *const ff_mpeg2_dc_scale_table[4]
static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride)
static double av_q2d(AVRational a)
Convert an AVRational to a double.
@ HUFFMAN_TABLE_OPTIMAL
Compute and use optimal Huffman tables.
void ff_estimate_b_frame_motion(MpegEncContext *s, int mb_x, int mb_y)
#define LOCAL_ALIGNED_16(t, v,...)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static enum AVPixelFormat pix_fmts[]
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
void ff_write_quant_matrix(PutBitContext *pb, uint16_t *matrix)
void ff_h263_encode_picture_header(MpegEncContext *s, int picture_number)
void ff_h263_encode_gob_header(MpegEncContext *s, int mb_line)
Encode a group of blocks header.
void ff_mpeg4_stuffing(PutBitContext *pbc)
add MPEG-4 stuffing bits (01...1)
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
int64_t rc_max_rate
maximum bitrate
uint64_t error[AV_NUM_DATA_POINTERS]
error
This structure describes the bitrate properties of an encoded bitstream.
uint64_t encoding_error[AV_NUM_DATA_POINTERS]
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
float p_masking
p block masking (0-> disabled)
static int mb_var_thread(AVCodecContext *c, void *arg)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int rc_buffer_size
decoder bitstream buffer size
int ff_find_unused_picture(AVCodecContext *avctx, Picture *picture, int shared)
static const AVClass h263_class
PutBitContext pb2
used for data partitioned VOPs
static double sqr(double x)
#define LIBAVUTIL_VERSION_INT
void ff_write_pass1_stats(MpegEncContext *s)
Describe the class of an AVClass context structure.
#define PTRDIFF_SPECIFIER
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
#define FF_MPV_DEPRECATED_BFRAME_OPTS
static void write_mb_info(MpegEncContext *s)
int f_code
forward MV resolution
av_cold void ff_mpv_idct_init(MpegEncContext *s)
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer.
struct AVCodecInternal * internal
Private context used for internal data.
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
int64_t bit_rate
the average bitrate
#define ROUNDED_DIV(a, b)
void ff_faandct(int16_t *data)
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_PICTURE_TYPE_I
Intra.
void ff_fdct_ifast(int16_t *data)
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
#define FF_MPV_DEPRECATED_MPEG_QUANT_OPT
#define AV_CODEC_FLAG_AC_PRED
H.263 advanced intra coding / MPEG-4 AC prediction.
int ildct_cmp
interlaced DCT comparison function
int ff_vbv_update(MpegEncContext *s, int frame_size)
av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
#define FF_MB_DECISION_SIMPLE
uses mb_cmp
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
void ff_jpeg_fdct_islow_8(int16_t *data)
int trellis
trellis RD quantization
int ff_alloc_picture(AVCodecContext *avctx, Picture *pic, MotionEstContext *me, ScratchpadContext *sc, int shared, int encoding, int chroma_x_shift, int chroma_y_shift, int out_format, int mb_stride, int mb_width, int mb_height, int b8_stride, ptrdiff_t *linesize, ptrdiff_t *uvlinesize)
Allocate a Picture.
const AVCodec ff_h263_encoder
void(* op_pixels_func)(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
void ff_jpeg_fdct_islow_10(int16_t *data)
void ff_clean_h263_qscales(MpegEncContext *s)
modify qscale so that encoding is actually possible in H.263 (limit difference to -2....
void(* qpel_mc_func)(uint8_t *dst, const uint8_t *src, ptrdiff_t stride)
static int weight(int i, int blen, int offset)
#define MV_TYPE_8X8
4 vectors (H.263, MPEG-4 4MV)
float temporal_cplx_masking
temporary complexity masking (0-> disabled)
static void mpv_encode_defaults(MpegEncContext *s)
Set the given MpegEncContext to defaults for encoding.
static void denoise_dct_c(MpegEncContext *s, int16_t *block)
static void set_put_bits_buffer_size(PutBitContext *s, int size)
Change the end of the buffer.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
static int get_sae(uint8_t *src, int ref, int stride)
char * stats_out
pass1 encoding statistics output buffer
#define AV_CODEC_FLAG_QPEL
Use qpel MC.
static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src)
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
int ff_mpeg_ref_picture(AVCodecContext *avctx, Picture *dst, Picture *src)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
void ff_mpeg4_clean_buffers(MpegEncContext *s)
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
static void dct_single_coeff_elimination(MpegEncContext *s, int n, int threshold)
#define CONFIG_MSMPEG4_ENCODER
const AVCodec ff_msmpeg4v2_encoder
const AVCodec ff_msmpeg4v3_encoder
uint16_t intra_matrix[64]
matrix transmitted in the bitstream
void ff_mpeg1_encode_slice_header(MpegEncContext *s)
int ff_pre_estimate_p_frame_motion(MpegEncContext *s, int mb_x, int mb_y)
void ff_mpeg1_clean_buffers(MpegEncContext *s)
unsigned int lambda2
(lambda*lambda) >> FF_LAMBDA_SHIFT
const int16_t ff_mpeg4_default_intra_matrix[64]
void ff_mpv_motion(MpegEncContext *s, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, int dir, uint8_t **ref_picture, op_pixels_func(*pix_op)[4], qpel_mc_func(*qpix_op)[16])
#define AV_NOPTS_VALUE
Undefined timestamp value.
static const AVOption mpv_generic_options[]
uint8_t * byte_buffer
temporary buffer used for encoders to store their bitstream
#define CANDIDATE_MB_TYPE_DIRECT0
void ff_mpeg1_encode_mb(MpegEncContext *s, int16_t block[8][64], int motion_x, int motion_y)
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
@ 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...
int64_t min_bitrate
Minimum bitrate of the stream, in bits per second.
const uint16_t ff_mpeg1_default_intra_matrix[256]
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
static av_always_inline void encode_mb_internal(MpegEncContext *s, int motion_x, int motion_y, int mb_block_height, int mb_block_width, int mb_block_count)
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode.
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
const int16_t ff_mpeg4_default_non_intra_matrix[64]
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
void ff_msmpeg4_encode_ext_header(MpegEncContext *s)
#define MV_TYPE_FIELD
2 vectors, one per field
int flags
A combination of AV_PKT_FLAG values.
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
int picture_in_gop_number
0-> first pic in gop, ...
int64_t avg_bitrate
Average bitrate of the stream, in bits per second.
unsigned int byte_buffer_size
#define FF_COMPLIANCE_NORMAL
void ff_clean_mpeg4_qscales(MpegEncContext *s)
modify mb_type & qscale so that encoding is actually possible in MPEG-4
#define AV_LOG_INFO
Standard information.
static void update_qscale(MpegEncContext *s)
static void ff_update_block_index(MpegEncContext *s)
uint64_t vbv_delay
The delay between the time the packet this structure is associated with is received and the time when...
static void encode_mb_hq(MpegEncContext *s, MpegEncContext *backup, MpegEncContext *best, int type, PutBitContext pb[2], PutBitContext pb2[2], PutBitContext tex_pb[2], int *dmin, int *next_block, int motion_x, int motion_y)
void ff_msmpeg4_encode_init(MpegEncContext *s)
void ff_speedhq_encode_mb(MpegEncContext *s, int16_t block[12][64])
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
void ff_dct_encode_init_x86(MpegEncContext *s)
#define i(width, name, range_min, range_max)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static int put_bits_count(PutBitContext *s)
static int dct_quantize_trellis_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow)
static int encode_thread(AVCodecContext *c, void *arg)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
const uint32_t ff_square_tab[512]
static int estimate_best_b_count(MpegEncContext *s)
int intra_dc_precision
precision of the intra DC coefficient - 8
int obmc
overlapped block motion compensation
PutBitContext tex_pb
used for data partitioned VOPs
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
int64_t max_bitrate
Maximum bitrate of the stream, in bits per second.
#define FF_MPV_DEPRECATED_MATRIX_OPT
static const int32_t qmat16[MAT_SIZE]
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...
const AVCodec ff_wmv1_encoder
static void get_visual_weight(int16_t *weight, uint8_t *ptr, int stride)
const uint16_t ff_h263_format[8][2]
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
void ff_flv_encode_picture_header(MpegEncContext *s, int picture_number)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
static const AVClass h263p_class
void ff_mpeg4_init_partitions(MpegEncContext *s)
const char * name
Name of the codec implementation.
@ AV_PKT_DATA_CPB_PROPERTIES
This side data corresponds to the AVCPBProperties struct.
int ff_init_me(MpegEncContext *s)
int avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame)
Supply a raw video or audio frame to the encoder.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
av_cold void ff_rate_control_uninit(MpegEncContext *s)
#define CANDIDATE_MB_TYPE_DIRECT
double buffer_index
amount of bits in the video/audio buffer
int h263_slice_structured
const uint8_t ff_zigzag_direct[64]
static int get_bits_diff(MpegEncContext *s)
#define AV_CODEC_FLAG_CLOSED_GOP
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
const uint16_t ff_mpeg1_default_non_intra_matrix[64]
int64_t buffer_size
The size of the buffer to which the ratecontrol is applied, in bits.
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
#define CANDIDATE_MB_TYPE_BIDIR_I
const uint16_t ff_inv_aanscales[64]
av_cold void ff_mjpeg_encode_close(MpegEncContext *s)
void ff_h263_loop_filter(MpegEncContext *s)
#define FF_MPV_FLAG_CBP_RD
void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
#define AV_INPUT_BUFFER_PADDING_SIZE
static void update_duplicate_context_after_me(MpegEncContext *dst, MpegEncContext *src)
int ff_rv10_encode_picture_header(MpegEncContext *s, int picture_number)
void ff_fix_long_mvs(MpegEncContext *s, uint8_t *field_select_table, int field_select, int16_t(*mv_table)[2], int f_code, int type, int truncate)
int dquant
qscale difference to prev qscale
float dark_masking
darkness masking (0-> disabled)
main external API structure.
int active_thread_type
Which multithreading methods are in use by the codec.
static uint8_t default_mv_penalty[MAX_FCODE+1][MAX_DMV *2+1]
void ff_estimate_p_frame_motion(MpegEncContext *s, int mb_x, int mb_y)
int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src)
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
#define CANDIDATE_MB_TYPE_INTRA
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
int qmin
minimum quantizer
int gop_picture_number
index of the first picture of a GOP based on fake_pic_num & MPEG-1 specific
static int select_input_picture(MpegEncContext *s)
float spatial_cplx_masking
spatial complexity masking (0-> disabled)
static void frame_end(MpegEncContext *s)
static int ref[MAX_W *MAX_W]
void ff_mpv_reconstruct_mb(MpegEncContext *s, int16_t block[12][64])
static float mean(const float *input, int size)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
#define CANDIDATE_MB_TYPE_FORWARD
#define FF_MB_DECISION_RD
rate distortion
static int shift(int a, int b)
void ff_wmv2_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
@ AV_PICTURE_TYPE_P
Predicted.
#define AVERROR_ENCODER_NOT_FOUND
Encoder not found.
int ff_speedhq_mb_y_order_to_mb(int mb_y_order, int mb_height, int *first_in_slice)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
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...
void ff_convert_matrix(MpegEncContext *s, int(*qmat)[64], uint16_t(*qmat16)[2][64], const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
void ff_mpeg1_encode_init(MpegEncContext *s)
Undefined Behavior In the C some operations are like signed integer overflow
void(* fdct)(int16_t *block)
static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
float rc_max_available_vbv_use
Ratecontrol attempt to use, at maximum, of what can be used without an underflow.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
static int dct_quantize_refine(MpegEncContext *s, int16_t *block, int16_t *weight, int16_t *orig, int n, int qscale)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
#define FF_MPV_FLAG_STRICT_GOP
int slices
Number of slices.
#define FF_MB_DECISION_BITS
chooses the one which needs the fewest bits
This structure stores compressed data.
static void clip_coeffs(MpegEncContext *s, int16_t *block, int last_index)
uint16_t * inter_matrix
custom inter quantization matrix Must be allocated with the av_malloc() family of functions,...
static int encode_picture(MpegEncContext *s, int picture_number)
int width
picture width / height.
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
static const double coeff[2][5]
The exact code depends on how similar the blocks are and how related they are to the block
#define FF_MPV_FLAG_QP_RD
int misc_bits
cbp, mb_type
void ff_mjpeg_encode_picture_trailer(PutBitContext *pb, int header_bits)
static void copy_context_after_encode(MpegEncContext *d, MpegEncContext *s, int type)
void ff_get_2pass_fcode(MpegEncContext *s)
int end_mb_y
end mb_y of this thread (so current thread should process start_mb_y <= row < end_mb_y)
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
static void copy_context_before_encode(MpegEncContext *d, MpegEncContext *s, int type)
void ff_h261_reorder_mb_index(MpegEncContext *s)
int ff_dct_quantize_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow)
static const uint8_t sp5x_qscale_five_quant_table[][64]
int display_picture_number
picture number in display order
@ AV_PICTURE_TYPE_S
S(GMC)-VOP MPEG-4.
@ AV_CODEC_ID_MPEG2VIDEO
preferred ID for MPEG-1/2 video decoding
#define FF_MPV_COMMON_OPTS
int ff_alloc_packet(AVCodecContext *avctx, AVPacket *avpkt, int64_t size)
Check AVPacket size and allocate data.
int ff_mjpeg_encode_stuffing(MpegEncContext *s)
Writes the complete JPEG frame when optimal huffman tables are enabled, otherwise writes the stuffing...
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
int alt_inter_vlc
alternative inter vlc
void ff_h263_encode_mb(MpegEncContext *s, int16_t block[6][64], int motion_x, int motion_y)
void ff_h261_encode_picture_header(MpegEncContext *s, int picture_number)
#define CANDIDATE_MB_TYPE_BACKWARD
const uint16_t ff_aanscales[64]
AVCPBProperties * av_cpb_properties_alloc(size_t *size)
Allocate a CPB properties structure and initialize its fields to default values.
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode.
static const AVOption h263p_options[]
static void write_slice_end(MpegEncContext *s)