From patchwork Tue May 7 05:36:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Li X-Patchwork-Id: 13025 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 C2769448606 for ; Tue, 7 May 2019 08:36:59 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AAE0668AC67; Tue, 7 May 2019 08:36:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A794368AAB5 for ; Tue, 7 May 2019 08:36:52 +0300 (EEST) Received: by mail-pg1-f180.google.com with SMTP id c13so7696234pgt.1 for ; Mon, 06 May 2019 22:36:52 -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=lZyCXcoHDCglflSOIAhMr3rpAtb4AThd5pBDiNrOdbE=; b=B/DM/ZzhtA6kmGX7xQ2teuc70c4z9FhuxcPC3Du3j28oN9tfNDNToCt5T+PyYkN37Y ouD9bTVnDstFztd0FJLPD2trGK8qVmVhVqESjD7B04fplW461gc4yYJ0+dUfowRBxNp0 s71bMib6yuFO8NzymjuTlcFUtSL7OLHEk1gKeqhqc/88dMA6CHtM7vWU+W2qY3iOYNl3 MhyQFBvvBwuEReP2pZZEF05/nZKmoyCzc0X7zImoo6OtYHP8fpP8eCPInvork1lpjz1d 68RBGXrryIONN8zUTNCMd+yLAR/OxyjhWdTs95Swa0KgQU9A4XE/rVYlCFzjgtaYzJ3b j+EA== 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=lZyCXcoHDCglflSOIAhMr3rpAtb4AThd5pBDiNrOdbE=; b=Zwyw8+2Yj39N/MLlgr5UVzhAsGuVkmTX9iTqyrXrkDZMsuCTmRkI8ccDSJ4FrlS53I s3WMuFnxuRgsO6FhilJxSEopVqz6Ykx3X8vjj8bmjV0xKObHhKxamndWGaL01Sfk0AsT hcKUtQLkuCTAdhVB7coeUPlg3t4HEa+aQNEHqlb8iOxi3rOl412J9wj6iOaLaUmkzKQ4 +YTrLlBa3iejX1Cqhgu7cG2FvU52/7yS+es9O1BQ0YoPRIy65346gQ8pRURqQNFisz24 ORr1/FL0uZE9J+rYZ/FdLYn9Qmu86F6+RDMzN0Pc4pzFsameuls2OhjN0pYoLBfp4dVg 2GsQ== X-Gm-Message-State: APjAAAWZ0T3Pj/BYIZPKjg01lhqES4yV1r+zm6PkKYNsqcllVc3qJAq9 4MnNl2Q0sRUbkKT7/PBKbGEqpy7A X-Google-Smtp-Source: APXvYqwUGQ7SVeh2MduQrGEtxL7IsYCVL9cX7Gijvd4iDRh5JWehbbhn+o2/lcIzl5uoRGhnYiO1xA== X-Received: by 2002:aa7:8208:: with SMTP id k8mr38925571pfi.69.1557207410717; Mon, 06 May 2019 22:36:50 -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 u7sm15919572pfu.157.2019.05.06.22.36.49 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 06 May 2019 22:36:49 -0700 (PDT) From: Jun Li To: ffmpeg-devel@ffmpeg.org Date: Mon, 6 May 2019 22:36:42 -0700 Message-Id: <20190507053642.8489-2-junli1026@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190507053642.8489-1-junli1026@gmail.com> References: <20190507053642.8489-1-junli1026@gmail.com> Subject: [FFmpeg-devel] [PATCH v3 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..8b65796459 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 = 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)