mpegvideo_enc: use the AVFrame API properly.
This commit is contained in:
parent
a6064b12b4
commit
1c01b0253e
@ -754,6 +754,9 @@ typedef struct MpegEncContext {
|
|||||||
ERContext er;
|
ERContext er;
|
||||||
|
|
||||||
int error_rate;
|
int error_rate;
|
||||||
|
|
||||||
|
/* temporary frames used by b_frame_strategy = 2 */
|
||||||
|
AVFrame *tmp_frames[MAX_B_FRAMES + 2];
|
||||||
} MpegEncContext;
|
} MpegEncContext;
|
||||||
|
|
||||||
#define REBASE_PICTURE(pic, new_ctx, old_ctx) \
|
#define REBASE_PICTURE(pic, new_ctx, old_ctx) \
|
||||||
|
@ -221,7 +221,7 @@ static void MPV_encode_defaults(MpegEncContext *s)
|
|||||||
av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
|
av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
MpegEncContext *s = avctx->priv_data;
|
MpegEncContext *s = avctx->priv_data;
|
||||||
int i;
|
int i, ret;
|
||||||
int chroma_h_shift, chroma_v_shift;
|
int chroma_h_shift, chroma_v_shift;
|
||||||
|
|
||||||
MPV_encode_defaults(s);
|
MPV_encode_defaults(s);
|
||||||
@ -780,12 +780,29 @@ av_cold int ff_MPV_encode_init(AVCodecContext *avctx)
|
|||||||
FF_ENABLE_DEPRECATION_WARNINGS;
|
FF_ENABLE_DEPRECATION_WARNINGS;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (avctx->b_frame_strategy == 2) {
|
||||||
|
for (i = 0; i < s->max_b_frames + 2; i++) {
|
||||||
|
s->tmp_frames[i] = av_frame_alloc();
|
||||||
|
if (!s->tmp_frames[i])
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
|
s->tmp_frames[i]->format = AV_PIX_FMT_YUV420P;
|
||||||
|
s->tmp_frames[i]->width = s->width >> avctx->brd_scale;
|
||||||
|
s->tmp_frames[i]->height = s->height >> avctx->brd_scale;
|
||||||
|
|
||||||
|
ret = av_frame_get_buffer(s->tmp_frames[i], 32);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
|
av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
MpegEncContext *s = avctx->priv_data;
|
MpegEncContext *s = avctx->priv_data;
|
||||||
|
int i;
|
||||||
|
|
||||||
ff_rate_control_uninit(s);
|
ff_rate_control_uninit(s);
|
||||||
|
|
||||||
@ -796,6 +813,9 @@ av_cold int ff_MPV_encode_end(AVCodecContext *avctx)
|
|||||||
|
|
||||||
av_freep(&avctx->extradata);
|
av_freep(&avctx->extradata);
|
||||||
|
|
||||||
|
for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
|
||||||
|
av_frame_free(&s->tmp_frames[i]);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1025,7 +1045,6 @@ static int estimate_best_b_count(MpegEncContext *s)
|
|||||||
{
|
{
|
||||||
AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
|
AVCodec *codec = avcodec_find_encoder(s->avctx->codec_id);
|
||||||
AVCodecContext *c = avcodec_alloc_context3(NULL);
|
AVCodecContext *c = avcodec_alloc_context3(NULL);
|
||||||
AVFrame input[MAX_B_FRAMES + 2];
|
|
||||||
const int scale = s->avctx->brd_scale;
|
const int scale = s->avctx->brd_scale;
|
||||||
int i, j, out_size, p_lambda, b_lambda, lambda2;
|
int i, j, out_size, p_lambda, b_lambda, lambda2;
|
||||||
int64_t best_rd = INT64_MAX;
|
int64_t best_rd = INT64_MAX;
|
||||||
@ -1060,19 +1079,9 @@ static int estimate_best_b_count(MpegEncContext *s)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i = 0; i < s->max_b_frames + 2; i++) {
|
for (i = 0; i < s->max_b_frames + 2; i++) {
|
||||||
int ysize = c->width * c->height;
|
|
||||||
int csize = (c->width / 2) * (c->height / 2);
|
|
||||||
Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
|
Picture pre_input, *pre_input_ptr = i ? s->input_picture[i - 1] :
|
||||||
s->next_picture_ptr;
|
s->next_picture_ptr;
|
||||||
|
|
||||||
avcodec_get_frame_defaults(&input[i]);
|
|
||||||
input[i].data[0] = av_malloc(ysize + 2 * csize);
|
|
||||||
input[i].data[1] = input[i].data[0] + ysize;
|
|
||||||
input[i].data[2] = input[i].data[1] + csize;
|
|
||||||
input[i].linesize[0] = c->width;
|
|
||||||
input[i].linesize[1] =
|
|
||||||
input[i].linesize[2] = c->width / 2;
|
|
||||||
|
|
||||||
if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
|
if (pre_input_ptr && (!i || s->input_picture[i - 1])) {
|
||||||
pre_input = *pre_input_ptr;
|
pre_input = *pre_input_ptr;
|
||||||
|
|
||||||
@ -1082,13 +1091,13 @@ static int estimate_best_b_count(MpegEncContext *s)
|
|||||||
pre_input.f.data[2] += INPLACE_OFFSET;
|
pre_input.f.data[2] += INPLACE_OFFSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->dsp.shrink[scale](input[i].data[0], input[i].linesize[0],
|
s->dsp.shrink[scale](s->tmp_frames[i]->data[0], s->tmp_frames[i]->linesize[0],
|
||||||
pre_input.f.data[0], pre_input.f.linesize[0],
|
pre_input.f.data[0], pre_input.f.linesize[0],
|
||||||
c->width, c->height);
|
c->width, c->height);
|
||||||
s->dsp.shrink[scale](input[i].data[1], input[i].linesize[1],
|
s->dsp.shrink[scale](s->tmp_frames[i]->data[1], s->tmp_frames[i]->linesize[1],
|
||||||
pre_input.f.data[1], pre_input.f.linesize[1],
|
pre_input.f.data[1], pre_input.f.linesize[1],
|
||||||
c->width >> 1, c->height >> 1);
|
c->width >> 1, c->height >> 1);
|
||||||
s->dsp.shrink[scale](input[i].data[2], input[i].linesize[2],
|
s->dsp.shrink[scale](s->tmp_frames[i]->data[2], s->tmp_frames[i]->linesize[2],
|
||||||
pre_input.f.data[2], pre_input.f.linesize[2],
|
pre_input.f.data[2], pre_input.f.linesize[2],
|
||||||
c->width >> 1, c->height >> 1);
|
c->width >> 1, c->height >> 1);
|
||||||
}
|
}
|
||||||
@ -1102,21 +1111,21 @@ static int estimate_best_b_count(MpegEncContext *s)
|
|||||||
|
|
||||||
c->error[0] = c->error[1] = c->error[2] = 0;
|
c->error[0] = c->error[1] = c->error[2] = 0;
|
||||||
|
|
||||||
input[0].pict_type = AV_PICTURE_TYPE_I;
|
s->tmp_frames[0]->pict_type = AV_PICTURE_TYPE_I;
|
||||||
input[0].quality = 1 * FF_QP2LAMBDA;
|
s->tmp_frames[0]->quality = 1 * FF_QP2LAMBDA;
|
||||||
|
|
||||||
out_size = encode_frame(c, &input[0]);
|
out_size = encode_frame(c, s->tmp_frames[0]);
|
||||||
|
|
||||||
//rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
|
//rd += (out_size * lambda2) >> FF_LAMBDA_SHIFT;
|
||||||
|
|
||||||
for (i = 0; i < s->max_b_frames + 1; i++) {
|
for (i = 0; i < s->max_b_frames + 1; i++) {
|
||||||
int is_p = i % (j + 1) == j || i == s->max_b_frames;
|
int is_p = i % (j + 1) == j || i == s->max_b_frames;
|
||||||
|
|
||||||
input[i + 1].pict_type = is_p ?
|
s->tmp_frames[i + 1]->pict_type = is_p ?
|
||||||
AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
|
AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_B;
|
||||||
input[i + 1].quality = is_p ? p_lambda : b_lambda;
|
s->tmp_frames[i + 1]->quality = is_p ? p_lambda : b_lambda;
|
||||||
|
|
||||||
out_size = encode_frame(c, &input[i + 1]);
|
out_size = encode_frame(c, s->tmp_frames[i + 1]);
|
||||||
|
|
||||||
rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
|
rd += (out_size * lambda2) >> (FF_LAMBDA_SHIFT - 3);
|
||||||
}
|
}
|
||||||
@ -1138,10 +1147,6 @@ static int estimate_best_b_count(MpegEncContext *s)
|
|||||||
avcodec_close(c);
|
avcodec_close(c);
|
||||||
av_freep(&c);
|
av_freep(&c);
|
||||||
|
|
||||||
for (i = 0; i < s->max_b_frames + 2; i++) {
|
|
||||||
av_freep(&input[i].data[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return best_b_count;
|
return best_b_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user