[Libav-user] How to pass quality scale to mjpeg encoder
Tobias Rapp
t.rapp at noa-archive.com
Thu Jan 25 16:54:18 EET 2018
On 25.01.2018 09:25, Tobias Rapp wrote:
> Hi,
>
> trying to do the equivalent of FFmpeg command-line output option "-q:v
> 3" on library level I came up with the following code (error checking
> stripped off):
>
> AVCodecContext *enc_ctx = NULL;
> const AVCodec *codec = avcodec_find_encoder_by_name("mjpeg");
> int ret;
>
> enc_ctx = avcodec_alloc_context3(codec);
> enc_ctx->flags |= AV_CODEC_FLAG_QSCALE;
> enc_ctx->global_quality = FF_QP2LAMBDA * 3.0;
> ret = avcodec_open2(enc_ctx, enc_ctx->codec, NULL);
>
> Unfortunately it doesn't seem to have any effect on the output image
> size. Is there something obvious that I'm missing?
>
Answering myself: Apparently setting the encoder option is not
sufficient for mjpeg. The encoding quality has to be set for each frame
that is passed to the encoder.
Example:
frame->quality = enc_ctx->global_quality;
frame->pict_type = AV_PICTURE_TYPE_NONE;
ret = avcodec_send_frame(enc_ctx, frame);
if (ret < 0) {
// ...
}
Looks weird but seems to work.
Regards,
Tobias
More information about the Libav-user
mailing list