[FFmpeg-devel] [PATCH] avcodec/libvpxenc: add VP8 support for ROI-based encoding
Derek Buitenhuis
derek.buitenhuis at gmail.com
Wed Feb 27 19:11:29 EET 2019
On 27/02/2019 16:12, Guo, Yejun wrote:
> Signed-off-by: Guo, Yejun <yejun.guo at intel.com>
> ---
> libavcodec/libvpxenc.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 132 insertions(+)
Do these APIs exist for all supported libvpx versions?
> + if (!sd) {
> + if (vpx_codec_control(&ctx->encoder, VP8E_SET_ACTIVEMAP, &active_map)) {
> + log_encoder_error(avctx, "Failed to set VP8E_SET_ACTIVEMAP codec control.\n");
> + return AVERROR_INVALIDDATA;
> + }
Why do this stuff at all if no ROIs have been set?
> + memset(active_map.active_map, 1, active_map.rows * active_map.cols);
Nit: Maybe a comment about what '1' is here.
> +
> + /* segment id 0 in roi_map is reserved for the areas not covered by AVRegionOfInterest.
> + * segment id 0 in roi_map is also for the areas with AVRegionOfInterest.qoffset near 0.
> + */
> + segment_id = 0;
> + segment_mapping[zero_delta_q + MAX_DELTA_Q] = segment_id + 1;
> + segment_id++;
This series of ops seems weirdly redundant separately?
> + memset(&roi_map, 0, sizeof(roi_map));
Can't zero-init?
> + av_free(active_map.active_map);
> + av_log(avctx, AV_LOG_ERROR,
> + "roi_map alloc (%d bytes) failed.\n",
> + roi_map.rows * roi_map.cols);
Here, and elsewhere: We don't write how many bytes failed, generally.
> + if (vpx_codec_control(&ctx->encoder, VP8E_SET_ROI_MAP, &roi_map)) {
> + av_free(active_map.active_map);
> + av_free(roi_map.roi_map);
> + log_encoder_error(avctx, "Failed to set VP8E_SET_ROI_MAP codec control.\n");
> + return AVERROR_INVALIDDATA;
> + }
> +
> + if (vpx_codec_control(&ctx->encoder, VP8E_SET_ACTIVEMAP, &active_map)) {
> + av_free(active_map.active_map);
> + av_free(roi_map.roi_map);
> + log_encoder_error(avctx, "Failed to set VP8E_SET_ACTIVEMAP codec control.\n");
> + return AVERROR_INVALIDDATA;
> + }
> +
> + av_free(active_map.active_map);
> + av_free(roi_map.roi_map);
With the amount of failure areas in this function, is it reasonable to roll it
into one goto fail or something?
> + if (avctx->codec_id == AV_CODEC_ID_VP8)
> + vp8_encode_set_roi(avctx, frame);
The API only exists for VP8, or is this due to different quant scales or something?
As an aside, I must say, libvpx's ROI API is real ugly.
Cheers,
- Derek
More information about the ffmpeg-devel
mailing list