[FFmpeg-devel] [PATCH v5] avcodec: Add librav1e encoder
Derek Buitenhuis
derek.buitenhuis at gmail.com
Sat Nov 9 23:15:35 EET 2019
On 09/11/2019 18:03, James Almer wrote:
>> + if (ctx->tile_rows >= 0) {
>
> Since these are no longer log2 values, does rav1e change 0 to 1 internally?
> It may be a better idea to make 0 the default, and only call
> rav1e_config_parse_int() if it's > 0.
Yes.
Changed to match this.
>> + if (ctx->tile_cols >= 0) {
>
> Ditto.
Fixed.
>
>> + rret = rav1e_config_parse_int(cfg, "tile_cols_log2", ctx->tile_cols);
>
> Should be "tile_cols".
Fixed.
>> + rret = rav1e_config_parse_int(cfg, "bitrate", avctx->bit_rate);
>> + if (rret < 0) {
>> + av_log(avctx, AV_LOG_ERROR, "Could not set bitrate.\n");
>> + ret = AVERROR_INVALIDDATA;
>> + goto end;
>> + }
>> + } else if (ctx->quantizer >= 0) {
>
> Bitrate will be ignored if set. Maybe the doxy could mention it, or a
> log message printed here to let the user know about it.
I've added a warning if both are set.
>> + switch (ret) {
>> + case RA_ENCODER_STATUS_SUCCESS:
>> + break;
>> + case RA_ENCODER_STATUS_ENOUGH_DATA:
>> + return AVERROR(EAGAIN);
>> + case RA_ENCODER_STATUS_FAILURE:
>> + av_log(avctx, AV_LOG_ERROR, "Could not send frame.\n");
>> + return AVERROR_EXTERNAL;
>> + default:
>> + av_log(avctx, AV_LOG_ERROR, "Unknown return code %d from rav1e_send_frame.\n", ret);
>> + return AVERROR_UNKNOWN;
>> + }
>
> You could use rav1e_status_to_str() to get the error string and print it
> for the STATUS_FAILURE and default cases.
Done, but I've kept it inside the switch.
> Ditto here. Only the custom NEED_MORE_DATA message printed while in
> draining mode is worth keeping.
Done.
>> +
>> + pkt->buf = av_buffer_create((uint8_t *) rpkt->data, rpkt->len, librav1e_packet_unref,
>> + rpkt, AV_BUFFER_FLAG_READONLY);
>
> When i came up with this zero-copy method i didn't realize that rav1e
> may not be padding the buffer in question. If the padding is not at
> least AV_INPUT_BUFFER_PADDING_SIZE big, then it's technically breaking
> the AVPacket API, and we may have to use av_new_packet() and copy the
> buffer instead.
I don't think we can guarantee AV_INPUT_BUFFER_PADDING_SIZE in rav1e's
API for packet data.
I also assume you meant ff_alloc_packet2(), and not av_new_packet().
I've converted it to that.
>> + { "tile-rows", "number of tiles rows to encode with", OFFSET(tile_rows), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT64_MAX, VE },
>> + { "tile-columns", "number of tiles columns to encode with", OFFSET(tile_cols), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT64_MAX, VE },
>
> These two are not documented.
Fixed.
Thanks for the review! New patch sent.
- Derek
More information about the ffmpeg-devel
mailing list