---
The input option handling probably isn't quite right. This probably
also should have some documentation somewhere?
---
avconv.h | 2 ++
avconv_filter.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
avconv_opt.c | 3 +++
3 files changed, 53 insertions(+)
diff --git a/avconv.h b/avconv.h
index b932d7e..3c881e1 100644
--- a/avconv.h
+++ b/avconv.h
@@ -138,6 +138,7 @@ typedef struct OptionsContext {
int audio_disable;
int subtitle_disable;
int data_disable;
+ int autorotate;
/* indexed by output file stream index */
int *streamid_map;
@@ -236,6 +237,7 @@ typedef struct InputStream {
AVDictionary *decoder_opts;
AVRational framerate; /* framerate forced with -r */
+ int autorotate;
int resample_height;
int resample_width;
int resample_pix_fmt;
diff --git a/avconv_filter.c b/avconv_filter.c
index e54da56..6898157 100644
--- a/avconv_filter.c
+++ b/avconv_filter.c
@@ -29,6 +29,7 @@
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/channel_layout.h"
+#include "libavutil/display.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/pixfmt.h"
@@ -226,6 +227,28 @@ static int insert_trim(int64_t start_time, int64_t
duration,
return 0;
}
+static int insert_filter(AVFilterContext **last_filter, int *pad_idx,
+ const char *filter_name, const char *args)
+{
+ AVFilterGraph *graph = (*last_filter)->graph;
+ AVFilterContext *ctx;
+ int ret;
+
+ ret = avfilter_graph_create_filter(&ctx,
+ avfilter_get_by_name(filter_name),
+ filter_name, args, NULL, graph);
+ if (ret < 0)
+ return ret;
+
+ ret = avfilter_link(*last_filter, *pad_idx, ctx, 0);
+ if (ret < 0)
+ return ret;
+
+ *last_filter = ctx;
+ *pad_idx = 0;
+ return 0;
+}
+
static int configure_output_video_filter(FilterGraph *fg, OutputFilter
*ofilter, AVFilterInOut *out)
{
char *pix_fmts;
@@ -446,6 +469,31 @@ static int configure_input_video_filter(FilterGraph *fg,
InputFilter *ifilter,
return ret;
last_filter = ifilter->filter;
+ if (ist->autorotate) {
+ double rot = 0;
+ int i;
+ for (i = 0; i < ist->st->nb_side_data; i++) {
+ const AVPacketSideData* sd = &ist->st->side_data[i];
+ switch (sd->type) {
+ case AV_PKT_DATA_DISPLAYMATRIX:
+ rot = av_display_rotation_get((int32_t *) sd->data);
+ break;
+ }
+ }
+ if (rot < -135 || rot > 135) {
+ ret = insert_filter(&last_filter, &pad_idx, "vflip", NULL);
+ if (ret < 0)
+ return ret;
+ ret = insert_filter(&last_filter, &pad_idx, "hflip", NULL);
+ } else if (rot < -45) {
+ ret = insert_filter(&last_filter, &pad_idx, "transpose",
"dir=clock");
+ } else if (rot > 45) {
+ ret = insert_filter(&last_filter, &pad_idx, "transpose",
"dir=cclock");
+ }
+ if (ret < 0)
+ return ret;
+ }
+
if (ist->framerate.num) {
AVFilterContext *setpts;
diff --git a/avconv_opt.c b/avconv_opt.c
index 1625429..ddcd7f3 100644
--- a/avconv_opt.c
+++ b/avconv_opt.c
@@ -484,6 +484,7 @@ static void add_input_streams(OptionsContext *o,
AVFormatContext *ic)
ist->file_index = nb_input_files;
ist->discard = 1;
st->discard = AVDISCARD_ALL;
+ ist->autorotate = o->autorotate;
ist->ts_scale = 1.0;
MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
@@ -2372,6 +2373,8 @@ const OptionDef options[] = {
{ "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
OPT_SPEC | OPT_INPUT,
{ .off = OFFSET(hwaccel_devices) },
"select a device for HW acceleration" "devicename" },
+ { "autorotate", OPT_BOOL | OPT_INPUT | OPT_OFFSET,
{ .off = OFFSET(autorotate) },
+ "automatically insert correct rotate filters", },
/* audio options */
{ "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT,
{ .func_arg = opt_audio_frames },
--
1.9.5 (Apple Git-50.3)
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel