[FFmpeg-devel] [PATCH 1/4] avcodec/mjpegdec: export display matrix frame side data when available

Eoff, Ullysses A ullysses.a.eoff at intel.com
Tue Sep 21 06:21:21 EEST 2021



> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces at ffmpeg.org> On Behalf Of James Almer
> Sent: Wednesday, September 08, 2021 11:34 AM
> To: ffmpeg-devel at ffmpeg.org
> Subject: [FFmpeg-devel] [PATCH 1/4] avcodec/mjpegdec: export display matrix frame side data when available
> 
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
>  libavcodec/mjpegdec.c | 53 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 53 insertions(+)
> 
> diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
> index 2a5868fe1d..7bec5ce221 100644
> --- a/libavcodec/mjpegdec.c
> +++ b/libavcodec/mjpegdec.c
> @@ -30,6 +30,7 @@
>   * MJPEG decoder.
>   */
> 
> +#include "libavutil/display.h"
>  #include "libavutil/imgutils.h"
>  #include "libavutil/avassert.h"
>  #include "libavutil/opt.h"
> @@ -2406,6 +2407,7 @@ int ff_mjpeg_receive_frame(AVCodecContext *avctx, AVFrame *frame)
>      int i, index;
>      int ret = 0;
>      int is16bit;
> +    AVDictionaryEntry *e = NULL;
> 
>      s->force_pal8 = 0;
> 
> @@ -2864,6 +2866,57 @@ the_end:
>          }
>      }
> 
> +    if (e = av_dict_get(s->exif_metadata, "Orientation", e, AV_DICT_IGNORE_SUFFIX)) {
> +        char *value = e->value + strspn(e->value, " \n\t\r"), *endptr;
> +        int orientation = strtol(value, &endptr, 0);
> +
> +        if (!*endptr) {
> +            AVFrameSideData *sd = NULL;
> +
> +            if (orientation >= 2 && orientation <= 8) {
> +                int32_t *matrix;
> +
> +                sd = av_frame_new_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX, sizeof(int32_t) * 9);
> +                if (!sd) {
> +                    av_log(s->avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
> +                    return AVERROR(ENOMEM);
> +                }
> +
> +                matrix = (int32_t *)sd->data;
> +
> +                switch (orientation) {
> +                case 2:
> +                    av_display_rotation_set(matrix, 0.0);
> +                    av_display_matrix_flip(matrix, 1, 0);
> +                    break;
> +                case 3:
> +                    av_display_rotation_set(matrix, 180.0);
> +                    break;
> +                case 4:
> +                    av_display_rotation_set(matrix, 180.0);
> +                    av_display_matrix_flip(matrix, 1, 0);
> +                    break;
> +                case 5:
> +                    av_display_rotation_set(matrix, 90.0);
> +                    av_display_matrix_flip(matrix, 0, 1);
> +                    break;
> +                case 6:
> +                    av_display_rotation_set(matrix, 90.0);
> +                    break;
> +                case 7:
> +                    av_display_rotation_set(matrix, -90.0);
> +                    av_display_matrix_flip(matrix, 0, 1);
> +                    break;
> +                case 8:
> +                    av_display_rotation_set(matrix, -90.0);
> +                    break;
> +                default:
> +                    av_assert0(0);
> +                }
> +            }
> +        }
> +    }
> +
>      av_dict_copy(&frame->metadata, s->exif_metadata, 0);
>      av_dict_free(&s->exif_metadata);
> 

James, please see regression reported in https://trac.ffmpeg.org/ticket/9432

> --
> 2.33.0
> 
> _______________________________________________
> 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