[FFmpeg-devel] [PATCH 06/10] lavc/videotoolboxenc: vastly simplify get_cv_pixel_info
Rick Kern
kernrj at gmail.com
Sun Dec 19 18:25:58 EET 2021
On Thu, Dec 16, 2021 at 7:13 PM rcombs <rcombs at rcombs.me> wrote:
> No longer requires per-format switch cases.
>
> The frame==0 path was unused (and would've crashed anyway).
> ---
> libavcodec/videotoolboxenc.c | 69 +++++++-----------------------------
> 1 file changed, 13 insertions(+), 56 deletions(-)
>
> diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
> index b66d44f6b7..82e01fbe29 100644
> --- a/libavcodec/videotoolboxenc.c
> +++ b/libavcodec/videotoolboxenc.c
> @@ -2034,6 +2034,7 @@ static int get_cv_pixel_info(
> size_t *strides,
> size_t *contiguous_buf_size)
> {
> + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
> VTEncContext *vtctx = avctx->priv_data;
> int av_format = frame->format;
> int av_color_range = frame->color_range;
> @@ -2041,6 +2042,9 @@ static int get_cv_pixel_info(
> int range_guessed;
> int status;
>
> + if (!desc)
> + return AVERROR(EINVAL);
> +
> status = get_cv_pixel_format(avctx, av_format, av_color_range, color,
> &range_guessed);
> if (status) {
> av_log(avctx,
> @@ -2065,63 +2069,16 @@ static int get_cv_pixel_info(
> }
> }
>
> - switch (av_format) {
> - case AV_PIX_FMT_NV12:
> - *plane_count = 2;
> -
> - widths [0] = avctx->width;
> - heights[0] = avctx->height;
> - strides[0] = frame ? frame->linesize[0] : avctx->width;
> -
> - widths [1] = (avctx->width + 1) / 2;
> - heights[1] = (avctx->height + 1) / 2;
> - strides[1] = frame ? frame->linesize[1] : (avctx->width + 1) & -2;
> - break;
> -
> - case AV_PIX_FMT_YUV420P:
> - *plane_count = 3;
> -
> - widths [0] = avctx->width;
> - heights[0] = avctx->height;
> - strides[0] = frame ? frame->linesize[0] : avctx->width;
> -
> - widths [1] = (avctx->width + 1) / 2;
> - heights[1] = (avctx->height + 1) / 2;
> - strides[1] = frame ? frame->linesize[1] : (avctx->width + 1) / 2;
> -
> - widths [2] = (avctx->width + 1) / 2;
> - heights[2] = (avctx->height + 1) / 2;
> - strides[2] = frame ? frame->linesize[2] : (avctx->width + 1) / 2;
> - break;
> + *plane_count = av_pix_fmt_count_planes(avctx->pix_fmt);
>
> - case AV_PIX_FMT_BGRA:
> - *plane_count = 1;
> -
> - widths [0] = avctx->width;
> - heights[0] = avctx->height;
> - strides[0] = frame ? frame->linesize[0] : avctx->width * 4;
> - break;
> -
> - case AV_PIX_FMT_P010LE:
> - *plane_count = 2;
> - widths[0] = avctx->width;
> - heights[0] = avctx->height;
> - strides[0] = frame ? frame->linesize[0] : (avctx->width * 2 + 63)
> & -64;
> -
> - widths[1] = (avctx->width + 1) / 2;
> - heights[1] = (avctx->height + 1) / 2;
> - strides[1] = frame ? frame->linesize[1] : ((avctx->width + 1) / 2
> + 63) & -64;
> - break;
> -
> - default:
> - av_log(
> - avctx,
> - AV_LOG_ERROR,
> - "Could not get frame format info for color %d range %d.\n",
> - av_format,
> - av_color_range);
> -
> - return AVERROR(EINVAL);
> + for (i = 0; i < desc->nb_components; i++) {
> + int p = desc->comp[i].plane;
> + int chroma = (p != 0) && (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA)
> || p + 1 != *plane_count);
>
This could be broken out into more variables to make the logic clearer. It
took me a while to parse this.
> + int shiftw = chroma ? desc->log2_chroma_w : 0;
> + int shifth = chroma ? desc->log2_chroma_h : 0;
> + widths[p] = (avctx->width + ((1 << shiftw) >> 1)) >> shiftw;
> + heights[p] = (avctx->height + ((1 << shifth) >> 1)) >> shifth;
> + strides[p] = frame->linesize[p];
> }
>
> *contiguous_buf_size = 0;
> --
> 2.33.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>
More information about the ffmpeg-devel
mailing list