[FFmpeg-devel] [PATCH] Add libx265 encoder
Derek Buitenhuis
derek.buitenhuis at gmail.com
Tue Feb 11 20:22:48 CET 2014
On 2/11/2014 7:12 PM, Clément Bœsch wrote:
>> +enabled libx265 && require_pkg_config x265 x265.h x265_encoder_encode &&
>> + { check_cpp_condition x265.h "X265_BUILD >= 5" ||
>> + die "ERROR: libx265 version must be >= 5."; }
>
> maybe require_pkg_config "x265 >= 5" x265.h x265_encoder_encode
Ah. Wasn't sure if there was a way to do this or not.
>> +/*
>> + * libx265 encoder
>> + *
>
> probably more appropriate as a /** @file ... */
... in contrast to literally every other header in every other decoder?
>
>> + * Copyright (c) 2013-2014 Derek Buitenhuis
>> + *
>
>> + * This file is part of Libav.
>
> We tend to use another project name here.
Sorry. git am fail on my part. Fixed locally.
>> +static av_cold int libx265_encode_close(AVCodecContext *avctx)
>> +{
>> + libx265Context *ctx = avctx->priv_data;
>> +
>> + av_freep(&avctx->coded_frame);
>
> av_frame_free()?
Fixed locally. I wrote the original patch before this existed.
>> + if (ctx->params)
>> + x265_param_free(ctx->params);
>> +
>> + if (ctx->encoder)
>> + x265_encoder_close(ctx->encoder);
>> +
>
> I guess it's pointless to ask if those function are smart enough to deal
> with NULL pointers.
Better safe than sorry IMO.
>> + if (avctx->width % ctx->params->maxCUSize) {
>> + av_log(avctx, AV_LOG_ERROR,
>> + "libx265 requires a width that is a multiple of %d.\n",
>> + ctx->params->maxCUSize);
>> + libx265_encode_close(avctx);
>
>> + return AVERROR_INVALIDDATA;
>
> invalid data doesn't refer to invalid user input data, but invalid data
> stream. You probably want to use AVERROR(EINVAL). Same below.
I'm always confused by this (and the mix of AVERROR(...) and AVERROR_...).
>> + ctx->encoder = x265_encoder_open(ctx->params);
>> + if (!ctx->encoder) {
>> + av_log(avctx, AV_LOG_ERROR, "Cannot open libx265 encoder.\n");
>> + libx265_encode_close(avctx);
>> + return AVERROR_INVALIDDATA;
>
> I think you want AVERROR_EXTERNAL.
Ditto.
>> + ctx->header = av_malloc(ctx->header_size);
>> + if (!ctx->header) {
>> + av_log(avctx, AV_LOG_ERROR, "Cannot allocate HEVC header.\n");
>
> Since you're being pedantic about printing error message, you probably
> want to print the size here.
I'm not sure it's useful info, but OK.
>> + memset(&x265pic_out, 0, sizeof(x265pic_out));
>
> {0} raises random warnings?
Yes, it didn't like it when I tried.
>> +#define OFFSET(x) offsetof(libx265Context, x)
>> +#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
>> +static const AVOption options[] = {
>> + { "preset", "Set the x265 preset.", OFFSET(preset), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
>> + { "tune", "Set teh x265 tune parameter.", OFFSET(tune), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
>> + { "x265-params", "Set the x265 configuration using a :-separated list of key=value parameters", OFFSET(x265_opts), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
>
> undo the initial cap and remove trailing '.' for current style.
libx264.c uses both caps and periods.
I fixed 'teh' btw.
>> + { NULL },
>
> trailing comma uneeded.
Other decoders use this style, so I did as well.
>> + .long_name = NULL_IF_CONFIG_SMALL("libx265 H.265 / HEVC"),
>
> nit: probably belongs below .name; I think that's the current convention.
OK.
> Changelog entry welcome.
It's there already. It's the first change in the patch.
- Derek
More information about the ffmpeg-devel
mailing list