|
|
|
@@ -27,6 +27,7 @@ |
|
|
|
|
|
|
|
#include "libavutil/avstring.h" |
|
|
|
#include "libavutil/colorspace.h" |
|
|
|
#include "libavutil/display.h" |
|
|
|
#include "libavutil/mathematics.h" |
|
|
|
#include "libavutil/pixdesc.h" |
|
|
|
#include "libavutil/imgutils.h" |
|
|
|
@@ -265,6 +266,7 @@ static int rdftspeed = 20; |
|
|
|
#if CONFIG_AVFILTER |
|
|
|
static char *vfilters = NULL; |
|
|
|
#endif |
|
|
|
static int autorotate = 1; |
|
|
|
|
|
|
|
/* current context */ |
|
|
|
static int is_full_screen; |
|
|
|
@@ -1548,6 +1550,22 @@ static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const c |
|
|
|
|
|
|
|
INSERT_FILT("format", "yuv420p"); |
|
|
|
|
|
|
|
if (autorotate) { |
|
|
|
uint8_t* displaymatrix = av_stream_get_side_data(is->video_st, |
|
|
|
AV_PKT_DATA_DISPLAYMATRIX, NULL); |
|
|
|
if (displaymatrix) { |
|
|
|
double rot = av_display_rotation_get((int32_t*) displaymatrix); |
|
|
|
if (rot < -135 || rot > 135) { |
|
|
|
INSERT_FILT("vflip", NULL); |
|
|
|
INSERT_FILT("hflip", NULL); |
|
|
|
} else if (rot < -45) { |
|
|
|
INSERT_FILT("transpose", "dir=clock"); |
|
|
|
} else if (rot > 45) { |
|
|
|
INSERT_FILT("transpose", "dir=cclock"); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (vfilters) { |
|
|
|
AVFilterInOut *outputs = avfilter_inout_alloc(); |
|
|
|
AVFilterInOut *inputs = avfilter_inout_alloc(); |
|
|
|
@@ -2928,6 +2946,7 @@ static const OptionDef options[] = { |
|
|
|
{ "rdftspeed", OPT_INT | HAS_ARG| OPT_AUDIO | OPT_EXPERT, { &rdftspeed }, "rdft speed", "msecs" }, |
|
|
|
{ "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, { opt_default }, "generic catch all option", "" }, |
|
|
|
{ "i", 0, { NULL }, "avconv compatibility dummy option", ""}, |
|
|
|
{ "autorotate", OPT_BOOL, { &autorotate }, "automatically rotate video", "" }, |
|
|
|
{ NULL, }, |
|
|
|
}; |
|
|
|
|
|
|
|
|