From patchwork Wed May 8 06:24:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Li X-Patchwork-Id: 13030 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id D4FFC447128 for ; Wed, 8 May 2019 09:24:29 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C467468A660; Wed, 8 May 2019 09:24:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2F09D6805D8 for ; Wed, 8 May 2019 09:24:23 +0300 (EEST) Received: by mail-pl1-f174.google.com with SMTP id d21so1924095plr.3 for ; Tue, 07 May 2019 23:24:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=daMpC1eiM80E6iJxofc5Z68EfAcFAWLB2XwvVkga+is=; b=ekdIOaO4sIT46/WcAJKGTjWDbAAA+VhTsugbFYB0Hoj8PwwiJ7yHpquS02GVJAHSWy SAkZNRiO/59G2J48SGgfxQT4GHoKXQ43Y0Lhi1SAI4urX+Zm50xLDdix943iTcIixypM qh9wkgvdKKQP5feMc5wTapndvJUTZ3XibiCdy3VOE3AAobdfQB2yCqMHKKEEdcxwe4+4 5yX4mYv+7/CLiYVzbSYfCfHoLrxCakw55vUJFmTHzNHG2qPDgxyJr7pzS+h7YpjIKPXM y7eDa5TJbqYHoLt4GPAy5sS/sAVoZTILTR042XqeHpGJSbH3xmS/mEbja73AuDyPLjNy CbbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=daMpC1eiM80E6iJxofc5Z68EfAcFAWLB2XwvVkga+is=; b=BAJxKmGDqpa9C+TJihIaLlhy8qUj7MBK+iW/PKshaPyA6vdKrGAeyNSbQ/f62eDYdX 0i15dNW+WxBPbyMuSzbOBCXdOlSz4sCUzTgEiHfF6n+owJ3tyWsYTR621enTOXGJ23FB AXEF7+/C+MSHjn7oIGtyiq+vT4WIRLl93rkd8ypX5HZe8fmRGq3xn4ksWi2W3ExFxFip GrN4ymLKs3E7cdTFvtz9yeShQkixMDcS+uePy1YWvuT0DeQiQD+K7WRQ8yJhr+dD/TEo 2gdWe5J6gJsLp62rc9jmh0KBZLj3kCGe3xgK9wSO326S0Mmla5DmbwE+fY9C/asnsGBt xicA== X-Gm-Message-State: APjAAAXXMZ0fusX+PHhWVWSzD3rmMBpBy0b4jdahAi9t1E5iuYYjhkmm KBaHPFN2TIqB5vavGGadNMMDFj7r X-Google-Smtp-Source: APXvYqw5rdB1jHrqPA9hhHXgQWypDz+UL4NQ+gsZhMh+uTR8VCTc/DlMeL3BrrWkBZ6M1L7eEjHBrQ== X-Received: by 2002:a17:902:28a9:: with SMTP id f38mr44629282plb.295.1557296661359; Tue, 07 May 2019 23:24:21 -0700 (PDT) Received: from super.lan (c-73-193-9-32.hsd1.wa.comcast.net. [73.193.9.32]) by smtp.gmail.com with ESMTPSA id g10sm40997949pfg.153.2019.05.07.23.24.20 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 07 May 2019 23:24:20 -0700 (PDT) From: Jun Li To: ffmpeg-devel@ffmpeg.org Date: Tue, 7 May 2019 23:24:08 -0700 Message-Id: <20190508062408.32558-2-junli1026@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190508062408.32558-1-junli1026@gmail.com> References: <20190508062408.32558-1-junli1026@gmail.com> Subject: [FFmpeg-devel] [PATCH v4 2/2] fftools/ffmpeg: Add stream metadata from first frame's metadata X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Fix #6945 Exif extension has 'Orientaion' field for image flip and rotation. This change is to add the first frame's exif into stream so that autorotation would use the info to adjust the frames. --- fftools/ffmpeg.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 01f04103cf..98ccaf0732 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -2341,6 +2341,58 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output, return err < 0 ? err : ret; } +static int set_metadata_from_1stframe(InputStream* ist, AVFrame* frame) +{ + // read exif Orientation data + AVDictionaryEntry *entry = av_dict_get(frame->metadata, "Orientation", NULL, 0); + int orientation = 0; + int32_t* sd = NULL; + if (entry) { + orientation = atoi(entry->value); + sd = (int32_t*)av_stream_new_side_data(ist->st, AV_PKT_DATA_DISPLAYMATRIX, 4 * 9); + if (!sd) + return AVERROR(ENOMEM); + memset(sd, 0, 4 * 9); + switch (orientation) + { + case 1: // horizontal (normal) + av_display_rotation_set(sd, 0.0); + break; + case 2: // mirror horizontal + av_display_rotation_set(sd, 0.0); + av_display_matrix_flip(sd, 1, 0); + break; + case 3: // rotate 180 + av_display_rotation_set(sd, 180.0); + break; + case 4: // mirror vertical + av_display_rotation_set(sd, 0.0); + av_display_matrix_flip(sd, 0, 1); + break; + case 5: // mirror horizontal and rotate 270 CW + av_display_rotation_set(sd, 270.0); + av_display_matrix_flip(sd, 0, 1); + break; + case 6: // rotate 90 CW + av_display_rotation_set(sd, 90.0); + break; + case 7: // mirror horizontal and rotate 90 CW + av_display_rotation_set(sd, 90.0); + av_display_matrix_flip(sd, 0, 1); + break; + case 8: // rotate 270 CW + av_display_rotation_set(sd, 270.0); + break; + default: + av_display_rotation_set(sd, 0.0); + av_log(ist->dec_ctx, AV_LOG_WARNING, + "Exif orientation data out of range: %i. Set to default value: horizontal(normal).\n", orientation); + break; + } + } + return 0; +} + static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *duration_pts, int eof, int *decode_failed) { @@ -2423,7 +2475,10 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_ decoded_frame->top_field_first = ist->top_field_first; ist->frames_decoded++; - + if (ist->frames_decoded == 1 && + ((err = set_metadata_from_1stframe(ist, decoded_frame)) < 0)) + goto fail; + if (ist->hwaccel_retrieve_data && decoded_frame->format == ist->hwaccel_pix_fmt) { err = ist->hwaccel_retrieve_data(ist->dec_ctx, decoded_frame); if (err < 0)