#include "mpegvideodata.h"
#include "h261.h"
#include "h263.h"
+#include "h263data.h"
#include "mjpegenc_common.h"
#include "mathops.h"
#include "mpegutils.h"
#include "internal.h"
#include "bytestream.h"
#include "wmv2.h"
+#include "rv10.h"
#include <limits.h>
#define QUANT_BIAS_SHIFT 8
av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
{
MpegEncContext *s = avctx->priv_data;
+ AVCPBProperties *cpb_props;
int i, ret, format_supported;
mpv_encode_defaults(s);
s->max_b_frames = avctx->max_b_frames;
s->codec_id = avctx->codec->id;
s->strict_std_compliance = avctx->strict_std_compliance;
- s->quarter_sample = (avctx->flags & CODEC_FLAG_QPEL) != 0;
+ s->quarter_sample = (avctx->flags & AV_CODEC_FLAG_QPEL) != 0;
s->mpeg_quant = avctx->mpeg_quant;
s->rtp_mode = !!avctx->rtp_payload_size;
s->intra_dc_precision = avctx->intra_dc_precision;
s->intra_only = 0;
}
+#if FF_API_MOTION_EST
+FF_DISABLE_DEPRECATION_WARNINGS
s->me_method = avctx->me_method;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
/* Fixed QSCALE */
- s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
+ s->fixed_qscale = !!(avctx->flags & AV_CODEC_FLAG_QSCALE);
#if FF_API_MPV_OPT
FF_DISABLE_DEPRECATION_WARNINGS
(s->mpv_flags & FF_MPV_FLAG_QP_RD)) &&
!s->fixed_qscale;
- s->loop_filter = !!(s->avctx->flags & CODEC_FLAG_LOOP_FILTER);
+ s->loop_filter = !!(s->avctx->flags & AV_CODEC_FLAG_LOOP_FILTER);
if (avctx->rc_max_rate && !avctx->rc_buffer_size) {
av_log(avctx, AV_LOG_ERROR,
"specified vbv buffer is too large for the given bitrate!\n");
}
- if ((s->avctx->flags & CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
+ if ((s->avctx->flags & AV_CODEC_FLAG_4MV) && s->codec_id != AV_CODEC_ID_MPEG4 &&
s->codec_id != AV_CODEC_ID_H263 && s->codec_id != AV_CODEC_ID_H263P &&
s->codec_id != AV_CODEC_ID_FLV1) {
av_log(avctx, AV_LOG_ERROR, "4MV not supported by codec\n");
return -1;
}
- if ((s->avctx->flags & (CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME)) &&
+ if ((s->avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME)) &&
s->codec_id != AV_CODEC_ID_MPEG4 && s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
av_log(avctx, AV_LOG_ERROR, "interlacing not supported by codec\n");
return -1;
}
if (s->avctx->scenechange_threshold < 1000000000 &&
- (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)) {
+ (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)) {
av_log(avctx, AV_LOG_ERROR,
"closed gop with scene change detection are not supported yet, "
"set threshold to 1000000000\n");
return -1;
}
- if (s->avctx->flags & CODEC_FLAG_LOW_DELAY) {
+ if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) {
if (s->codec_id != AV_CODEC_ID_MPEG2VIDEO) {
av_log(avctx, AV_LOG_ERROR,
"low delay forcing is only available for mpeg2\n");
}
}
+ if (avctx->slices > 1 &&
+ (avctx->codec_id == AV_CODEC_ID_FLV1 || avctx->codec_id == AV_CODEC_ID_H261)) {
+ av_log(avctx, AV_LOG_ERROR, "Multiple slices are not supported by this codec\n");
+ return AVERROR(EINVAL);
+ }
+
if (s->avctx->thread_count > 1 &&
s->codec_id != AV_CODEC_ID_MPEG4 &&
s->codec_id != AV_CODEC_ID_MPEG1VIDEO &&
return -1;
}
- if (s->avctx->thread_count > 1)
- s->rtp_mode = 1;
-
if (!avctx->time_base.den || !avctx->time_base.num) {
av_log(avctx, AV_LOG_ERROR, "framerate not set\n");
return -1;
}
- if (avctx->b_frame_strategy && (avctx->flags & CODEC_FLAG_PASS2)) {
+ if (avctx->b_frame_strategy && (avctx->flags & AV_CODEC_FLAG_PASS2)) {
av_log(avctx, AV_LOG_INFO,
"notice: b_frame_strategy only affects the first pass\n");
avctx->b_frame_strategy = 0;
s->inter_quant_bias = -(1 << (QUANT_BIAS_SHIFT - 2));
}
+#if FF_API_QUANT_BIAS
+FF_DISABLE_DEPRECATION_WARNINGS
if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
s->intra_quant_bias = avctx->intra_quant_bias;
if (avctx->inter_quant_bias != FF_DEFAULT_QUANT_BIAS)
s->inter_quant_bias = avctx->inter_quant_bias;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
if (avctx->codec_id == AV_CODEC_ID_MPEG4 &&
s->avctx->time_base.den > (1 << 16) - 1) {
switch (avctx->codec->id) {
case AV_CODEC_ID_MPEG1VIDEO:
s->out_format = FMT_MPEG1;
- s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
+ s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
break;
case AV_CODEC_ID_MPEG2VIDEO:
s->out_format = FMT_MPEG1;
- s->low_delay = !!(s->avctx->flags & CODEC_FLAG_LOW_DELAY);
+ s->low_delay = !!(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY);
avctx->delay = s->low_delay ? 0 : (s->max_b_frames + 1);
s->rtp_mode = 1;
break;
s->out_format = FMT_H263;
s->h263_plus = 1;
/* Fx */
- s->h263_aic = (avctx->flags & CODEC_FLAG_AC_PRED) ? 1 : 0;
+ s->h263_aic = (avctx->flags & AV_CODEC_FLAG_AC_PRED) ? 1 : 0;
s->modified_quant = s->h263_aic;
- s->loop_filter = (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
+ s->loop_filter = (avctx->flags & AV_CODEC_FLAG_LOOP_FILTER) ? 1 : 0;
s->unrestricted_mv = s->obmc || s->loop_filter || s->umvplus;
/* /Fx */
s->encoding = 1;
s->progressive_frame =
- s->progressive_sequence = !(avctx->flags & (CODEC_FLAG_INTERLACED_DCT |
- CODEC_FLAG_INTERLACED_ME) ||
+ s->progressive_sequence = !(avctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
+ AV_CODEC_FLAG_INTERLACED_ME) ||
s->alternate_scan);
/* init */
ff_pixblockdsp_init(&s->pdsp, avctx);
ff_qpeldsp_init(&s->qdsp);
- s->avctx->coded_frame = s->current_picture.f;
-
if (s->msmpeg4_version) {
FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
2 * 2 * (MAX_LEVEL + 1) *
if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant)
s->chroma_qscale_table = ff_h263_chroma_qscale_table;
+ if (s->slice_context_count > 1) {
+ s->rtp_mode = 1;
+
+ if (avctx->codec_id == AV_CODEC_ID_H263 || avctx->codec_id == AV_CODEC_ID_H263P)
+ s->h263_slice_structured = 1;
+ }
+
s->quant_precision = 5;
ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
}
}
+ cpb_props = ff_add_cpb_side_data(avctx);
+ if (!cpb_props)
+ return AVERROR(ENOMEM);
+ cpb_props->max_bitrate = avctx->rc_max_rate;
+ cpb_props->min_bitrate = avctx->rc_min_rate;
+ cpb_props->avg_bitrate = avctx->bit_rate;
+ cpb_props->buffer_size = avctx->rc_buffer_size;
+
return 0;
fail:
ff_mpv_encode_end(avctx);
return acc;
}
+static int alloc_picture(MpegEncContext *s, Picture *pic, int shared)
+{
+ return ff_alloc_picture(s->avctx, pic, &s->me, &s->sc, shared, 1,
+ s->chroma_x_shift, s->chroma_y_shift, s->out_format,
+ s->mb_stride, s->mb_height, s->b8_stride,
+ &s->linesize, &s->uvlinesize);
+}
static int load_input_picture(MpegEncContext *s, const AVFrame *pic_arg)
{
Picture *pic = NULL;
int64_t pts;
int i, display_picture_number = 0, ret;
- const int encoding_delay = s->max_b_frames ? s->max_b_frames :
- (s->low_delay ? 0 : 1);
+ int encoding_delay = s->max_b_frames ? s->max_b_frames
+ : (s->low_delay ? 0 : 1);
+ int flush_offset = 1;
int direct = 1;
if (pic_arg) {
pts = display_picture_number;
}
}
- }
- if (pic_arg) {
if (!pic_arg->buf[0] ||
pic_arg->linesize[0] != s->linesize ||
pic_arg->linesize[1] != s->uvlinesize ||
if ((ret = av_frame_ref(pic->f, pic_arg)) < 0)
return ret;
}
- ret = ff_alloc_picture(s, pic, direct);
+ ret = alloc_picture(s, pic, direct);
if (ret < 0)
return ret;
pic->f->display_picture_number = display_picture_number;
pic->f->pts = pts; // we set this here to avoid modifiying pic_arg
+ } else {
+ /* Flushing: When we have not received enough input frames,
+ * ensure s->input_picture[0] contains the first picture */
+ for (flush_offset = 0; flush_offset < encoding_delay + 1; flush_offset++)
+ if (s->input_picture[flush_offset])
+ break;
+
+ if (flush_offset <= 1)
+ flush_offset = 1;
+ else
+ encoding_delay = encoding_delay - flush_offset + 1;
}
/* shift buffer entries */
- for (i = 1; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
- s->input_picture[i - 1] = s->input_picture[i];
+ for (i = flush_offset; i < MAX_PICTURE_COUNT /*s->encoding_delay + 1*/; i++)
+ s->input_picture[i - flush_offset] = s->input_picture[i];
s->input_picture[encoding_delay] = (Picture*) pic;
return ret;
ret = pkt.size;
- av_free_packet(&pkt);
+ av_packet_unref(&pkt);
return ret;
}
c->width = s->width >> scale;
c->height = s->height >> scale;
- c->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_PSNR;
- c->flags |= s->avctx->flags & CODEC_FLAG_QPEL;
+ c->flags = AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_PSNR;
+ c->flags |= s->avctx->flags & AV_CODEC_FLAG_QPEL;
c->mb_decision = s->avctx->mb_decision;
c->me_cmp = s->avctx->me_cmp;
c->mb_cmp = s->avctx->mb_cmp;
}
}
- if (s->avctx->flags & CODEC_FLAG_PASS2) {
+ if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
for (i = 0; i < s->max_b_frames + 1; i++) {
int pict_num = s->input_picture[0]->f->display_picture_number + i;
s->gop_size > s->picture_in_gop_number) {
b_frames = s->gop_size - s->picture_in_gop_number - 1;
} else {
- if (s->avctx->flags & CODEC_FLAG_CLOSED_GOP)
+ if (s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP)
b_frames = 0;
s->input_picture[b_frames]->f->pict_type = AV_PICTURE_TYPE_I;
}
}
- if ((s->avctx->flags & CODEC_FLAG_CLOSED_GOP) && b_frames &&
+ if ((s->avctx->flags & AV_CODEC_FLAG_CLOSED_GOP) && b_frames &&
s->input_picture[b_frames]->f->pict_type == AV_PICTURE_TYPE_I)
b_frames--;
}
}
no_output_pic:
+ ff_mpeg_unref_picture(s->avctx, &s->new_picture);
+
if (s->reordered_input_picture[0]) {
s->reordered_input_picture[0]->reference =
s->reordered_input_picture[0]->f->pict_type !=
AV_PICTURE_TYPE_B ? 3 : 0;
- ff_mpeg_unref_picture(s->avctx, &s->new_picture);
if ((ret = ff_mpeg_ref_picture(s->avctx, &s->new_picture, s->reordered_input_picture[0])))
return ret;
pic = &s->picture[i];
pic->reference = s->reordered_input_picture[0]->reference;
- if (ff_alloc_picture(s, pic, 0) < 0) {
+ if (alloc_picture(s, pic, 0) < 0) {
return -1;
}
return ret;
s->picture_number = s->new_picture.f->display_picture_number;
- } else {
- ff_mpeg_unref_picture(s->avctx, &s->new_picture);
}
return 0;
}
}
}
- s->avctx->coded_frame = s->current_picture_ptr->f;
-
+#if FF_API_CODED_FRAME
+FF_DISABLE_DEPRECATION_WARNINGS
+ av_frame_copy_props(s->avctx->coded_frame, s->current_picture.f);
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
+#if FF_API_ERROR_FRAME
+FF_DISABLE_DEPRECATION_WARNINGS
+ memcpy(s->current_picture.f->error, s->current_picture.encoding_error,
+ sizeof(s->current_picture.encoding_error));
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
}
static void update_noise_reduction(MpegEncContext *s)
/* output? */
if (s->new_picture.f->data[0]) {
+ uint8_t *sd;
if (!pkt->data &&
(ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
return ret;
frame_end(s);
+ sd = av_packet_new_side_data(pkt, AV_PKT_DATA_QUALITY_FACTOR,
+ sizeof(int));
+ if (!sd)
+ return AVERROR(ENOMEM);
+ *(int *)sd = s->current_picture.f->quality;
+
if (CONFIG_MJPEG_ENCODER && s->out_format == FMT_MJPEG)
ff_mjpeg_encode_picture_trailer(&s->pb, s->header_bits);
assert(s->avctx->rc_max_rate);
}
- if (s->avctx->flags & CODEC_FLAG_PASS1)
+ if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
ff_write_pass1_stats(s);
for (i = 0; i < 4; i++) {
- s->current_picture_ptr->f->error[i] = s->current_picture.f->error[i];
- avctx->error[i] += s->current_picture_ptr->f->error[i];
+ s->current_picture_ptr->encoding_error[i] = s->current_picture.encoding_error[i];
+ avctx->error[i] += s->current_picture_ptr->encoding_error[i];
}
- if (s->avctx->flags & CODEC_FLAG_PASS1)
+ if (s->avctx->flags & AV_CODEC_FLAG_PASS1)
assert(avctx->header_bits + avctx->mv_bits + avctx->misc_bits +
avctx->i_tex_bits + avctx->p_tex_bits ==
put_bits_count(&s->pb));
s->out_format == FMT_MPEG1 &&
90000LL * (avctx->rc_buffer_size - 1) <=
s->avctx->rc_max_rate * 0xFFFFLL) {
+ AVCPBProperties *props;
+ size_t props_size;
+
int vbv_delay, min_delay;
double inbits = s->avctx->rc_max_rate *
av_q2d(s->avctx->time_base);
s->vbv_delay_ptr[1] = vbv_delay >> 5;
s->vbv_delay_ptr[2] &= 0x07;
s->vbv_delay_ptr[2] |= vbv_delay << 3;
+
+ props = av_cpb_properties_alloc(&props_size);
+ if (!props)
+ return AVERROR(ENOMEM);
+ props->vbv_delay = vbv_delay * 300;
+
+#if FF_API_VBV_DELAY
+FF_DISABLE_DEPRECATION_WARNINGS
avctx->vbv_delay = vbv_delay * 300;
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
}
s->total_bits += s->frame_bits;
avctx->frame_bits = s->frame_bits;
}
if (s->mb_intra) {
- if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
+ if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
int progressive_score, interlaced_score;
s->interlaced_dct = 0;
s->pdsp.get_pixels(s->block[2], ptr_y + dct_offset, wrap_y);
s->pdsp.get_pixels(s->block[3], ptr_y + dct_offset + 8, wrap_y);
- if (s->avctx->flags & CODEC_FLAG_GRAY) {
+ if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
skip_dct[4] = 1;
skip_dct[5] = 1;
} else {
op_pix, op_qpix);
}
- if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
+ if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
int progressive_score, interlaced_score;
s->interlaced_dct = 0;
s->pdsp.diff_pixels(s->block[3], ptr_y + dct_offset + 8,
dest_y + dct_offset + 8, wrap_y);
- if (s->avctx->flags & CODEC_FLAG_GRAY) {
+ if (s->avctx->flags & AV_CODEC_FLAG_GRAY) {
skip_dct[4] = 1;
skip_dct[5] = 1;
} else {
}
}
- if ((s->avctx->flags & CODEC_FLAG_GRAY) && s->mb_intra) {
+ if ((s->avctx->flags & AV_CODEC_FLAG_GRAY) && s->mb_intra) {
s->block_last_index[4] =
s->block_last_index[5] = 0;
s->block[4][0] =
avpriv_align_put_bits(&s->pb);
flush_put_bits(&s->pb);
- if ((s->avctx->flags & CODEC_FLAG_PASS1) && !s->partitioned_frame)
+ if ((s->avctx->flags & AV_CODEC_FLAG_PASS1) && !s->partitioned_frame)
s->misc_bits+= get_bits_diff(s);
}
/* note: quant matrix value (8) is implied here */
s->last_dc[i] = 128 << s->intra_dc_precision;
- s->current_picture.f->error[i] = 0;
+ s->current_picture.encoding_error[i] = 0;
}
s->mb_skip_run = 0;
memset(s->last_mv, 0, sizeof(s->last_mv));
}
}
+#if FF_API_RTP_CALLBACK
+FF_DISABLE_DEPRECATION_WARNINGS
if (s->avctx->rtp_callback){
int number_mb = (mb_y - s->resync_mb_y)*s->mb_width + mb_x - s->resync_mb_x;
s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, current_packet_size, number_mb);
}
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
update_mb_info(s, 1);
switch(s->codec_id){
break;
}
- if (s->avctx->flags & CODEC_FLAG_PASS1) {
+ if (s->avctx->flags & AV_CODEC_FLAG_PASS1) {
int bits= put_bits_count(&s->pb);
s->misc_bits+= bits - s->last_bits;
s->last_bits= bits;
s->p_mv_table[xy][1]=0;
}
- if (s->avctx->flags & CODEC_FLAG_PSNR) {
+ if (s->avctx->flags & AV_CODEC_FLAG_PSNR) {
int w= 16;
int h= 16;
if(s->mb_x*16 + 16 > s->width ) w= s->width - s->mb_x*16;
if(s->mb_y*16 + 16 > s->height) h= s->height- s->mb_y*16;
- s->current_picture.f->error[0] += sse(
+ s->current_picture.encoding_error[0] += 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);
- s->current_picture.f->error[1] += sse(
+ s->current_picture.encoding_error[1] += sse(
s, s->new_picture.f->data[1] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
s->dest[1], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
- s->current_picture.f->error[2] += sse(
+ s->current_picture.encoding_error[2] += sse(
s, s->new_picture.f->data[2] + s->mb_x*8 + s->mb_y*s->uvlinesize*chr_h,
s->dest[2], w>>1, h>>s->chroma_y_shift, s->uvlinesize);
}
write_slice_end(s);
+#if FF_API_RTP_CALLBACK
+FF_DISABLE_DEPRECATION_WARNINGS
/* Send the last GOB if RTP */
if (s->avctx->rtp_callback) {
int number_mb = (mb_y - s->resync_mb_y)*s->mb_width - s->resync_mb_x;
emms_c();
s->avctx->rtp_callback(s->avctx, s->ptr_lastgob, pdif, number_mb);
}
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif
return 0;
}
MERGE(misc_bits);
MERGE(er.error_count);
MERGE(padding_bug_score);
- MERGE(current_picture.f->error[0]);
- MERGE(current_picture.f->error[1]);
- MERGE(current_picture.f->error[2]);
+ MERGE(current_picture.encoding_error[0]);
+ MERGE(current_picture.encoding_error[1]);
+ MERGE(current_picture.encoding_error[2]);
if(dst->avctx->noise_reduction){
for(i=0; i<64; i++){
s->no_rounding ^= 1;
}
- if (s->avctx->flags & CODEC_FLAG_PASS2) {
+ if (s->avctx->flags & AV_CODEC_FLAG_PASS2) {
if (estimate_qp(s,1) < 0)
return -1;
ff_get_2pass_fcode(s);
- } else if (!(s->avctx->flags & CODEC_FLAG_QSCALE)) {
+ } else if (!(s->avctx->flags & AV_CODEC_FLAG_QSCALE)) {
if(s->pict_type==AV_PICTURE_TYPE_B)
s->lambda= s->last_lambda_for[s->pict_type];
else
if(s->pict_type==AV_PICTURE_TYPE_P || s->pict_type==AV_PICTURE_TYPE_S) {
s->f_code= ff_get_best_fcode(s, s->p_mv_table, CANDIDATE_MB_TYPE_INTER);
- if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
+ if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
int a,b;
a= ff_get_best_fcode(s, s->p_field_mv_table[0][0], CANDIDATE_MB_TYPE_INTER_I); //FIXME field_select
b= ff_get_best_fcode(s, s->p_field_mv_table[1][1], CANDIDATE_MB_TYPE_INTER_I);
ff_fix_long_p_mvs(s);
ff_fix_long_mvs(s, NULL, 0, s->p_mv_table, s->f_code, CANDIDATE_MB_TYPE_INTER, 0);
- if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
+ if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
int j;
for(i=0; i<2; i++){
for(j=0; j<2; j++)
ff_fix_long_mvs(s, NULL, 0, s->b_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BACKWARD, 1);
ff_fix_long_mvs(s, NULL, 0, s->b_bidir_forw_mv_table, s->f_code, CANDIDATE_MB_TYPE_BIDIR, 1);
ff_fix_long_mvs(s, NULL, 0, s->b_bidir_back_mv_table, s->b_code, CANDIDATE_MB_TYPE_BIDIR, 1);
- if (s->avctx->flags & CODEC_FLAG_INTERLACED_ME) {
+ if (s->avctx->flags & AV_CODEC_FLAG_INTERLACED_ME) {
int dir, j;
for(dir=0; dir<2; dir++){
for(i=0; i<2; i++){
if (s->qscale < 3 && s->max_qcoeff <= 128 &&
s->pict_type == AV_PICTURE_TYPE_I &&
- !(s->avctx->flags & CODEC_FLAG_QSCALE))
+ !(s->avctx->flags & AV_CODEC_FLAG_QSCALE))
s->qscale= 3; //reduce clipping problems
if (s->out_format == FMT_MJPEG) {
return last_non_zero;
}
+/**
+ * Permute an 8x8 block according to permuatation.
+ * @param block the block which will be permuted according to
+ * the given permutation vector
+ * @param permutation the permutation vector
+ * @param last the last non zero coefficient in scantable order, used to
+ * speed the permutation up
+ * @param scantable the used scantable, this is only used to speed the
+ * permutation up, the block is not (inverse) permutated
+ * to scantable order!
+ */
+static void block_permute(int16_t *block, uint8_t *permutation,
+ const uint8_t *scantable, int last)
+{
+ int i;
+ int16_t temp[64];
+
+ if (last <= 0)
+ return;
+ //FIXME it is ok but not clean and might fail for some permutations
+ // if (permutation[1] == 1)
+ // return;
+
+ for (i = 0; i <= last; i++) {
+ const int j = scantable[i];
+ temp[j] = block[j];
+ block[j] = 0;
+ }
+
+ for (i = 0; i <= last; i++) {
+ const int j = scantable[i];
+ const int perm_j = permutation[j];
+ block[perm_j] = temp[j];
+ }
+}
+
int ff_dct_quantize_c(MpegEncContext *s,
int16_t *block, int n,
int qscale, int *overflow)
/* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
- ff_block_permute(block, s->idsp.idct_permutation,
- scantable, last_non_zero);
+ block_permute(block, s->idsp.idct_permutation,
+ scantable, last_non_zero);
return last_non_zero;
}
.init = ff_mpv_encode_init,
.encode2 = ff_mpv_encode_picture,
.close = ff_mpv_encode_end,
- .capabilities = CODEC_CAP_SLICE_THREADS,
+ .capabilities = AV_CODEC_CAP_SLICE_THREADS,
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
.priv_class = &h263p_class,
};
-FF_MPV_GENERIC_CLASS(msmpeg4v2)
+static const AVClass msmpeg4v2_class = {
+ .class_name = "msmpeg4v2 encoder",
+ .item_name = av_default_item_name,
+ .option = ff_mpv_generic_options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
AVCodec ff_msmpeg4v2_encoder = {
.name = "msmpeg4v2",
.priv_class = &msmpeg4v2_class,
};
-FF_MPV_GENERIC_CLASS(msmpeg4v3)
+static const AVClass msmpeg4v3_class = {
+ .class_name = "msmpeg4v3 encoder",
+ .item_name = av_default_item_name,
+ .option = ff_mpv_generic_options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
AVCodec ff_msmpeg4v3_encoder = {
.name = "msmpeg4",
.priv_class = &msmpeg4v3_class,
};
-FF_MPV_GENERIC_CLASS(wmv1)
+static const AVClass wmv1_class = {
+ .class_name = "wmv1 encoder",
+ .item_name = av_default_item_name,
+ .option = ff_mpv_generic_options,
+ .version = LIBAVUTIL_VERSION_INT,
+};
AVCodec ff_wmv1_encoder = {
.name = "wmv1",