On Tue, May 28, 2019 at 1:50 PM Michael Niedermayer <mich...@niedermayer.cc> wrote:
> On Mon, May 27, 2019 at 11:18:26PM -0700, Jun Li wrote: > > Fix #6945 > > Rotate or/and flip frame according to frame's metadata orientation > > --- > > fftools/ffmpeg.c | 16 +++++++++++++++- > > fftools/ffmpeg.h | 3 ++- > > fftools/ffmpeg_filter.c | 28 +++++++++++++++++++++++----- > > 3 files changed, 40 insertions(+), 7 deletions(-) > > > > diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c > > index 01f04103cf..2f4229a9d0 100644 > > --- a/fftools/ffmpeg.c > > +++ b/fftools/ffmpeg.c > > @@ -2126,6 +2126,19 @@ static int > ifilter_has_all_input_formats(FilterGraph *fg) > > return 1; > > } > > > > +static int orientation_need_update(InputFilter *ifilter, AVFrame *frame) > > +{ > > + int orientaion = get_frame_orientation(frame); > > + int filterst = ifilter->orientation <= 1 ? 0 : // not set > > + ifilter->orientation <= 4 ? 1 : // auto flip > > + 2; // auto transpose > > + int framest = orientaion <= 1 ? 0 : // not set > > + orientaion <= 4 ? 1 : // auto flip > > + 2; // auto transpose > > + > > + return filterst != framest; > > +} > > + > > static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame) > > { > > FilterGraph *fg = ifilter->graph; > > @@ -2142,7 +2155,8 @@ static int ifilter_send_frame(InputFilter > *ifilter, AVFrame *frame) > > break; > > case AVMEDIA_TYPE_VIDEO: > > need_reinit |= ifilter->width != frame->width || > > - ifilter->height != frame->height; > > + ifilter->height != frame->height || > > + orientation_need_update(ifilter, frame); > > break; > > } > > > > diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h > > index eb1eaf6363..54532ef0eb 100644 > > --- a/fftools/ffmpeg.h > > +++ b/fftools/ffmpeg.h > > @@ -244,7 +244,7 @@ typedef struct InputFilter { > > // parameters configured for this input > > int format; > > > > - int width, height; > > + int width, height, orientation; > > AVRational sample_aspect_ratio; > > > > int sample_rate; > > @@ -649,6 +649,7 @@ int init_complex_filtergraph(FilterGraph *fg); > > void sub2video_update(InputStream *ist, AVSubtitle *sub); > > > > int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame > *frame); > > +int get_frame_orientation(const AVFrame* frame); > > > > int ffmpeg_parse_options(int argc, char **argv); > > > > diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c > > index 72838de1e2..ff63540906 100644 > > --- a/fftools/ffmpeg_filter.c > > +++ b/fftools/ffmpeg_filter.c > > @@ -743,6 +743,18 @@ static int sub2video_prepare(InputStream *ist, > InputFilter *ifilter) > > return 0; > > } > > > > +int get_frame_orientation(const AVFrame *frame) > > +{ > > + AVDictionaryEntry *entry = NULL; > > + int orientation = 0; > > + > > + // read exif orientation data > > + entry = av_dict_get(frame->metadata, "Orientation", NULL, 0); > > > + if (entry) > > + orientation = atoi(entry->value); > > this probably should be checking the validity of the string unless > it has been checked already elsewhere Thanks Michael for the catch. I updated to version 5: https://patchwork.ffmpeg.org/patch/13321/ https://patchwork.ffmpeg.org/patch/13322/ Best Regards, Jun > thx > > [...] > -- > Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB > > I have never wished to cater to the crowd; for what I know they do not > approve, and what they approve I do not know. -- Epicurus > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".