[FFmpeg-devel] [PATCH 1/2] add support for ROI-based encoding
Guo, Yejun
yejun.guo at intel.com
Mon Dec 24 10:41:32 EET 2018
> -----Original Message-----
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> Of Derek Buitenhuis
> Sent: Saturday, December 22, 2018 12:36 AM
> To: ffmpeg-devel at ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH 1/2] add support for ROI-based
> encoding
>
> A few comments below.
>
> On 12/12/2018 16:26, Guo, Yejun wrote:
> > + if (frame->rois_buf != NULL) {
> > + if (x4->params.rc.i_aq_mode == X264_AQ_NONE) {
> > + av_log(ctx, AV_LOG_ERROR, "Adaptive quantization must
> > + be enabled to use ROI encoding, skipping ROI.\n");
>
> This should, in my opinion, return an error and fail hard.
>
> If people want it to continue anyway, it should be AV_LOG_WARNING.
thanks, WARNING is better, will change to it.
>
> > + } else {
> > + if (frame->interlaced_frame == 0) {
> > + const static int MBSIZE = 16;
>
> I think we generally use defines for this stuff.
will change to define.
>
> > + size_t mbx = (frame->width + MBSIZE - 1) / MBSIZE;
> > + size_t mby = (frame->height + MBSIZE - 1) /
> > + MBSIZE;
>
>
> > + float* qoffsets = (float*)av_malloc(sizeof(float)
> > + * mbx * mby);
>
> Convention in FFmpeg is to use sizeof(*var).
ok, I'll follow it.
>
> > + memset(qoffsets, 0, sizeof(float) * mbx * mby);
>
> Missing NULL check for alloc failure.
thanks, will add the check.
>
> > +
> > + size_t nb_rois = frame->rois_buf->size /
> > + sizeof(AVFrameROI);
>
> I think we have some macros that do this already.
I tried a code search and do not find one, there is a similar macro which does not work for this case: #define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
I might miss it, I'll try again to see if any luck.
>
> > + AVFrameROI* rois = (AVFrameROI*)frame->rois_buf->data;
> > + for (size_t roi = 0; roi < nb_rois; ++roi) {
>
> Nit/convention: roi++
ok, will change.
>
> > + int starty = FFMIN(mby, rois[roi].top / MBSIZE);
> > + int endy = FFMIN(mby, (rois[roi].bottom + MBSIZE - 1)/
> MBSIZE);
> > + int startx = FFMIN(mbx, rois[roi].left / MBSIZE);
> > + int endx = FFMIN(mbx, (rois[roi].right + MBSIZE - 1)/ MBSIZE);
> > + for (int y = starty; y < endy; ++y) {
> > + for (int x = startx; x < endx; ++x) {
and will also change to x++ and y ++
> > + qoffsets[x + y*mbx] = get_roi_qoffset(ctx,
> rois[roi].quality);
> > + }
> > + }
> > + }
> > +
> > + x4->pic.prop.quant_offsets = qoffsets;
> > + x4->pic.prop.quant_offsets_free = av_free;
> > + } else {
> > + av_log(ctx, AV_LOG_ERROR, "interlaced_frame not
> > + supported for ROI encoding yet, skipping ROI.\n");
>
> Same comment as befor: return error or change to warning.
will change to warning.
>
>
>
> > +enum AVRoiQuality {
>
> Probably should be AVROIQuality.
>
> > + AV_RQ_NONE = 0,
> > + AV_RQ_BETTER = 1,
> > + AV_RQ_BEST = 2,
> > +};
> > +
> > +typedef struct AVFrameROI {
> > + /* coordinates at frame pixel level.
> > + * it will be extended internally if the codec requirs an alignment
> > + */
> > + size_t top;
> > + size_t bottom;
> > + size_t left;
> > + size_t right;
> > + enum AVRoiQuality quality;
> > +} AVFrameROI;
>
> Are we not going to allow the API to set an actual offset? This really limits
> what someone can do. (I say this as a user of x264's ROI API, in my own
> codebase, at least.)
thanks, the new idea is to use an integer value instead of the enum.
>
> Cheers,
> - Derek
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list