Handle possible failure of ff_eval.
Originally committed as revision 6338 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
4
ffmpeg.c
4
ffmpeg.c
@@ -827,6 +827,10 @@ static void do_video_out(AVFormatContext *s,
|
|||||||
ret = avcodec_encode_video(enc,
|
ret = avcodec_encode_video(enc,
|
||||||
bit_buffer, bit_buffer_size,
|
bit_buffer, bit_buffer_size,
|
||||||
&big_picture);
|
&big_picture);
|
||||||
|
if (ret == -1) {
|
||||||
|
fprintf(stderr, "Video encoding failed\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
//enc->frame_number = enc->real_pict_num;
|
//enc->frame_number = enc->real_pict_num;
|
||||||
if(ret>0){
|
if(ret>0){
|
||||||
pkt.data= bit_buffer;
|
pkt.data= bit_buffer;
|
||||||
|
@@ -39,7 +39,7 @@
|
|||||||
//#include <assert.h>
|
//#include <assert.h>
|
||||||
|
|
||||||
#ifdef CONFIG_ENCODERS
|
#ifdef CONFIG_ENCODERS
|
||||||
static void encode_picture(MpegEncContext *s, int picture_number);
|
static int encode_picture(MpegEncContext *s, int picture_number);
|
||||||
#endif //CONFIG_ENCODERS
|
#endif //CONFIG_ENCODERS
|
||||||
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
|
static void dct_unquantize_mpeg1_intra_c(MpegEncContext *s,
|
||||||
DCTELEM *block, int n, int qscale);
|
DCTELEM *block, int n, int qscale);
|
||||||
@@ -2502,7 +2502,8 @@ int MPV_encode_picture(AVCodecContext *avctx,
|
|||||||
//printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
|
//printf("qs:%f %f %d\n", s->new_picture.quality, s->current_picture.quality, s->qscale);
|
||||||
MPV_frame_start(s, avctx);
|
MPV_frame_start(s, avctx);
|
||||||
|
|
||||||
encode_picture(s, s->picture_number);
|
if (encode_picture(s, s->picture_number) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
avctx->real_pict_num = s->picture_number;
|
avctx->real_pict_num = s->picture_number;
|
||||||
avctx->header_bits = s->header_bits;
|
avctx->header_bits = s->header_bits;
|
||||||
@@ -5463,10 +5464,13 @@ static void merge_context_after_encode(MpegEncContext *dst, MpegEncContext *src)
|
|||||||
flush_put_bits(&dst->pb);
|
flush_put_bits(&dst->pb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void estimate_qp(MpegEncContext *s, int dry_run){
|
static int estimate_qp(MpegEncContext *s, int dry_run){
|
||||||
if (!s->fixed_qscale)
|
if (!s->fixed_qscale) {
|
||||||
s->current_picture_ptr->quality=
|
s->current_picture_ptr->quality=
|
||||||
s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run);
|
s->current_picture.quality = ff_rate_estimate_qscale(s, dry_run);
|
||||||
|
if (s->current_picture.quality < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if(s->adaptive_quant){
|
if(s->adaptive_quant){
|
||||||
switch(s->codec_id){
|
switch(s->codec_id){
|
||||||
@@ -5488,7 +5492,7 @@ static void estimate_qp(MpegEncContext *s, int dry_run){
|
|||||||
update_qscale(s);
|
update_qscale(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void encode_picture(MpegEncContext *s, int picture_number)
|
static int encode_picture(MpegEncContext *s, int picture_number)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int bits;
|
int bits;
|
||||||
@@ -5517,7 +5521,8 @@ static void encode_picture(MpegEncContext *s, int picture_number)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(s->flags & CODEC_FLAG_PASS2){
|
if(s->flags & CODEC_FLAG_PASS2){
|
||||||
estimate_qp(s, 1);
|
if (estimate_qp(s,1) < 0)
|
||||||
|
return -1;
|
||||||
ff_get_2pass_fcode(s);
|
ff_get_2pass_fcode(s);
|
||||||
}else if(!(s->flags & CODEC_FLAG_QSCALE)){
|
}else if(!(s->flags & CODEC_FLAG_QSCALE)){
|
||||||
if(s->pict_type==B_TYPE)
|
if(s->pict_type==B_TYPE)
|
||||||
@@ -5623,7 +5628,8 @@ static void encode_picture(MpegEncContext *s, int picture_number)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
estimate_qp(s, 0);
|
if (estimate_qp(s, 0) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
|
if(s->qscale < 3 && s->max_qcoeff<=128 && s->pict_type==I_TYPE && !(s->flags & CODEC_FLAG_QSCALE))
|
||||||
s->qscale= 3; //reduce clipping problems
|
s->qscale= 3; //reduce clipping problems
|
||||||
|
@@ -326,6 +326,10 @@ static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_f
|
|||||||
};
|
};
|
||||||
|
|
||||||
bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce);
|
bits= ff_eval(s->avctx->rc_eq, const_values, const_names, func1, func1_names, NULL, NULL, rce);
|
||||||
|
if (isnan(bits)) {
|
||||||
|
av_log(s->avctx, AV_LOG_ERROR, "Unable to parse rc_eq \"%s\".\n", s->avctx->rc_eq);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
rcc->pass1_rc_eq_output_sum+= bits;
|
rcc->pass1_rc_eq_output_sum+= bits;
|
||||||
bits*=rate_factor;
|
bits*=rate_factor;
|
||||||
@@ -726,6 +730,8 @@ float ff_rate_estimate_qscale(MpegEncContext *s, int dry_run)
|
|||||||
rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation;
|
rate_factor= rcc->pass1_wanted_bits/rcc->pass1_rc_eq_output_sum * br_compensation;
|
||||||
|
|
||||||
q= get_qscale(s, rce, rate_factor, picture_number);
|
q= get_qscale(s, rce, rate_factor, picture_number);
|
||||||
|
if (q < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
assert(q>0.0);
|
assert(q>0.0);
|
||||||
//printf("%f ", q);
|
//printf("%f ", q);
|
||||||
|
@@ -3875,6 +3875,8 @@ static int ratecontrol_1pass(SnowContext *s, AVFrame *pict)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pict->quality= ff_rate_estimate_qscale(&s->m, 1);
|
pict->quality= ff_rate_estimate_qscale(&s->m, 1);
|
||||||
|
if (pict->quality < 0)
|
||||||
|
return -1;
|
||||||
s->lambda= pict->quality * 3/2;
|
s->lambda= pict->quality * 3/2;
|
||||||
delta_qlog= qscale2qlog(pict->quality) - s->qlog;
|
delta_qlog= qscale2qlog(pict->quality) - s->qlog;
|
||||||
s->qlog+= delta_qlog;
|
s->qlog+= delta_qlog;
|
||||||
@@ -4060,8 +4062,11 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size,
|
|||||||
s->m.pict_type =
|
s->m.pict_type =
|
||||||
pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type;
|
pict->pict_type= s->m.rc_context.entry[avctx->frame_number].new_pict_type;
|
||||||
s->keyframe= pict->pict_type==FF_I_TYPE;
|
s->keyframe= pict->pict_type==FF_I_TYPE;
|
||||||
if(!(avctx->flags&CODEC_FLAG_QSCALE))
|
if(!(avctx->flags&CODEC_FLAG_QSCALE)) {
|
||||||
pict->quality= ff_rate_estimate_qscale(&s->m, 0);
|
pict->quality= ff_rate_estimate_qscale(&s->m, 0);
|
||||||
|
if (pict->quality < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}else{
|
}else{
|
||||||
s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
|
s->keyframe= avctx->gop_size==0 || avctx->frame_number % avctx->gop_size == 0;
|
||||||
s->m.pict_type=
|
s->m.pict_type=
|
||||||
@@ -4181,6 +4186,8 @@ redo_frame:
|
|||||||
|
|
||||||
if(s->pass1_rc && plane_index==0){
|
if(s->pass1_rc && plane_index==0){
|
||||||
int delta_qlog = ratecontrol_1pass(s, pict);
|
int delta_qlog = ratecontrol_1pass(s, pict);
|
||||||
|
if (delta_qlog < 0)
|
||||||
|
return -1;
|
||||||
if(delta_qlog){
|
if(delta_qlog){
|
||||||
//reordering qlog in the bitstream would eliminate this reset
|
//reordering qlog in the bitstream would eliminate this reset
|
||||||
ff_init_range_encoder(c, buf, buf_size);
|
ff_init_range_encoder(c, buf, buf_size);
|
||||||
@@ -4267,7 +4274,8 @@ STOP_TIMER("pred-conv")}
|
|||||||
s->m.current_picture.quality = pict->quality;
|
s->m.current_picture.quality = pict->quality;
|
||||||
s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start);
|
s->m.total_bits += 8*(s->c.bytestream - s->c.bytestream_start);
|
||||||
if(s->pass1_rc)
|
if(s->pass1_rc)
|
||||||
ff_rate_estimate_qscale(&s->m, 0);
|
if (ff_rate_estimate_qscale(&s->m, 0) < 0)
|
||||||
|
return -1;
|
||||||
if(avctx->flags&CODEC_FLAG_PASS1)
|
if(avctx->flags&CODEC_FLAG_PASS1)
|
||||||
ff_write_pass1_stats(&s->m);
|
ff_write_pass1_stats(&s->m);
|
||||||
s->m.last_pict_type = s->m.pict_type;
|
s->m.last_pict_type = s->m.pict_type;
|
||||||
|
Reference in New Issue
Block a user