Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Anton Khirnov <anton@khirnov.net>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [RFC]lavc/tiff: Support dng cropping
Date: Mon, 31 Oct 2022 13:38:53 +0100
Message-ID: <166721993346.12287.10742392140936295449@lain.khirnov.net> (raw)
In-Reply-To: <CAB0OVGoyYuHSNu9F_B8=WRy3qumCjJALJgBtutqHSFpK2BWkpg@mail.gmail.com>

Quoting Carl Eugen Hoyos (2022-10-23 20:46:57)
> Am So., 23. Okt. 2022 um 16:35 Uhr schrieb Carl Eugen Hoyos
> <ceffmpeg@gmail.com>:
> >
> > Hi!
> >
> > I tried to implement dng cropping, it unfortunately can only work with
> > -flags +unaligned, is there an alternative to simply print a warning
> > if the flag was not supplied?
> 
> New patch with more parentheses attached.
> 
> Please comment, Carl Eugen
> 
> From 1bfe065564604659b7703e75b1bb750c031fdc81 Mon Sep 17 00:00:00 2001
> From: Carl Eugen Hoyos <ceffmpeg@gmail.com>
> Date: Sun, 23 Oct 2022 16:31:53 +0200
> Subject: [PATCH] lavc/tiff: Support dng cropping,

A FATE test would be nice.

> needs -flags +unaligned

AFAICT this is not entirely correct. Applying left cropping in
libavcodec might need AV_CODEC_FLAG_UNALIGNED, but not always. Users may
also set apply_cropping=0 and apply cropping themselves.

The decoder should not care about it in any case, since it's handled in
the generic code.

> 
> Fixes samples mentioned in ticket #4364.
> ---
>  libavcodec/tiff.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++
>  libavcodec/tiff.h |  3 ++
>  2 files changed, 86 insertions(+)
> 
> diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
> index fd9db18c0b..33edff8213 100644
> --- a/libavcodec/tiff.c
> +++ b/libavcodec/tiff.c
> @@ -1492,6 +1492,89 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
>      case DNG_WHITE_LEVEL:
>          s->white_level = value;
>          break;
> +    case DNG_CROP_ORIGIN:
> +        if (count != 2 || type != TIFF_SHORT && type != TIFF_LONG && type != TIFF_RATIONAL) {

This condition could definitely use more parentheses. Same in two checks
below.

> +            av_log(s->avctx, AV_LOG_WARNING, "Invalid crop origin (count: %d, type: %d)\n", count, type);
> +            break;
> +        }
> +        if (type == TIFF_RATIONAL) {
> +            unsigned denum1, denum2;
> +            value  = ff_tget(&s->gb, TIFF_LONG, s->le);
> +            denum1 = ff_tget(&s->gb, TIFF_LONG, s->le);
> +            value2 = ff_tget(&s->gb, TIFF_LONG, s->le);
> +            denum2 = ff_tget(&s->gb, TIFF_LONG, s->le);
> +            if (denum1 != 1 || denum2 != 1) {
> +                av_log(s->avctx, AV_LOG_WARNING, "Unsupported crop origin\n");
> +                break;
> +            }
> +        } else {
> +            value  = ff_tget(&s->gb, type, s->le);
> +            value2 = ff_tget(&s->gb, type, s->le);
> +        }

This entire block is duplicated for DNG_CROP_ORIGIN and DNG_CROP_SIZE,
you could split it into a function.

> +        av_log(s->avctx, AV_LOG_DEBUG, "dng crop origin: %d/%d\n", value, value2);
> +        if (value >= s->width || value2 >= s->height) {
> +            av_log(s->avctx, AV_LOG_WARNING, "Invalid crop origin (%d/%d)\n", value, value2);
> +            break;
> +        }
> +        if ((value || value2) && !(s->avctx->flags & AV_CODEC_FLAG_UNALIGNED)) {
> +            av_log(s->avctx, AV_LOG_WARNING,"Correct DNG cropping needs -flags +unaligned\n");
> +        } else {
> +            frame->crop_left = value;
> +            frame->crop_top = value2;
> +        }
> +        break;
> +    case DNG_CROP_SIZE:
> +        if (count != 2 || type != TIFF_SHORT && type != TIFF_LONG && type != TIFF_RATIONAL) {
> +            av_log(s->avctx, AV_LOG_WARNING, "Invalid crop size (count: %d, type: %d)\n", count, type);
> +            break;
> +        }
> +        if (type == TIFF_RATIONAL) {
> +            unsigned denum1, denum2;
> +            value  = ff_tget(&s->gb, TIFF_LONG, s->le);
> +            denum1 = ff_tget(&s->gb, TIFF_LONG, s->le);
> +            value2 = ff_tget(&s->gb, TIFF_LONG, s->le);
> +            denum2 = ff_tget(&s->gb, TIFF_LONG, s->le);
> +            if (denum1 != 1 || denum2 != 1) {
> +                av_log(s->avctx, AV_LOG_WARNING, "Unsupported crop size\n");
> +                break;
> +            }
> +        } else {
> +            value  = ff_tget(&s->gb, type, s->le);
> +            value2 = ff_tget(&s->gb, type, s->le);
> +        }
> +        av_log(s->avctx, AV_LOG_DEBUG, "dng crop size %d x %d\n", value, value2);
> +        if (value + frame->crop_left >= s->width || value2 + frame->crop_top >= s->height) {

value/value2 can be arbitrary 32bit integers, so the addition can
overflow. Move crop_left/top to the other side of the comparison, since
they are known to be smaller than width/height. Analogously for
DNG_ACTIVE_AREA.

-- 
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2022-10-31 12:39 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-23 14:35 Carl Eugen Hoyos
2022-10-23 18:46 ` Carl Eugen Hoyos
2022-10-31 12:38   ` Anton Khirnov [this message]
2022-11-01  2:08     ` Carl Eugen Hoyos
2022-11-01 10:15       ` Anton Khirnov
2022-11-06 21:53     ` Carl Eugen Hoyos

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=166721993346.12287.10742392140936295449@lain.khirnov.net \
    --to=anton@khirnov.net \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git