Re: [FFmpeg-devel] [PATCH 07/25] avfilter: negotiate color_range between filters

2017-12-17 Thread Michael Niedermayer
On Sun, Dec 17, 2017 at 11:00:13AM +0100, Paul B Mahol wrote:
[...]

> @@ -130,17 +165,26 @@ static int query_formats(AVFilterContext *ctx)
>  {
>  FormatContext *s = ctx->priv;
>  AVFilterFormats *formats = ff_make_format_list(s->formats);
> +AVFilterFormats *color_ranges = 
> ff_make_color_range_list(s->color_ranges);
> +int ret;

this results in a warning:

libavfilter/vf_format.c: In function ‘query_formats’:
libavfilter/vf_format.c:168:5: warning: passing argument 1 of 
‘ff_make_color_range_list’ from incompatible pointer type [enabled by default]

[...]

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Into a blind darkness they enter who follow after the Ignorance,
they as if into a greater darkness enter who devote themselves
to the Knowledge alone. -- Isha Upanishad


signature.asc
Description: PGP signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 07/25] avfilter: negotiate color_range between filters

2017-12-17 Thread Paul B Mahol
Signed-off-by: Paul B Mahol 
---
 fftools/ffmpeg.c   |  2 ++
 fftools/ffmpeg.h   |  1 +
 fftools/ffmpeg_filter.c| 57 +---
 fftools/ffmpeg_opt.c   |  2 ++
 libavcodec/utils.c | 11 +++
 libavfilter/avf_abitscope.c|  4 +++
 libavfilter/avf_ahistogram.c   |  4 +++
 libavfilter/avf_aphasemeter.c  |  4 +++
 libavfilter/avf_avectorscope.c |  4 +++
 libavfilter/avf_concat.c   | 12 ++-
 libavfilter/avf_showcqt.c  |  4 +++
 libavfilter/avf_showfreqs.c|  4 +++
 libavfilter/avf_showspectrum.c |  4 +++
 libavfilter/avf_showvolume.c   |  4 +++
 libavfilter/avf_showwaves.c|  4 +++
 libavfilter/avfilter.c |  9 +++--
 libavfilter/avfilter.h |  4 ++-
 libavfilter/avfiltergraph.c| 53 +
 libavfilter/buffersink.c   | 16 +
 libavfilter/buffersink.h   |  1 +
 libavfilter/buffersrc.c|  4 +++
 libavfilter/formats.c  | 75 +++---
 libavfilter/formats.h  | 31 +
 libavfilter/internal.h | 11 +++
 libavfilter/vf_format.c| 46 +-
 libavfilter/vf_noise.c |  6 +++-
 libavfilter/vf_scale.c | 17 --
 libavfilter/vsrc_testsrc.c | 15 +++--
 tests/fate/filter-video.mak|  2 +-
 tests/fate/pixlet.mak  |  2 +-
 30 files changed, 390 insertions(+), 23 deletions(-)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 6aff3366c5..64de55d9a5 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -3390,6 +3390,8 @@ static int init_output_stream_encode(OutputStream *ost)
 enc_ctx->bits_per_raw_sample = FFMIN(dec_ctx->bits_per_raw_sample,
  
av_pix_fmt_desc_get(enc_ctx->pix_fmt)->comp[0].depth);
 
+enc_ctx->color_range = 
av_buffersink_get_color_range(ost->filter->filter);
+
 enc_ctx->framerate = ost->frame_rate;
 
 ost->st->avg_frame_rate = ost->frame_rate;
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 4e73d59082..071f3651f8 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -271,6 +271,7 @@ typedef struct OutputFilter {
 
 /* desired output stream properties */
 int width, height;
+enum AVColorRange color_range;
 AVRational frame_rate;
 int format;
 int sample_rate;
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 877fd670e6..16ad79625b 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -89,6 +89,28 @@ enum AVPixelFormat choose_pixel_fmt(AVStream *st, 
AVCodecContext *enc_ctx, AVCod
 return target;
 }
 
+static enum AVColorRange choose_color_range(AVStream *st, AVCodecContext 
*enc_ctx, AVCodec *codec, enum AVColorRange target)
+{
+if (codec && codec->color_ranges) {
+const enum AVColorRange *p = codec->color_ranges;
+
+for (; *p != AVCOL_RANGE_UNSPECIFIED; p++) {
+if (*p == target)
+break;
+}
+if (*p == AVCOL_RANGE_UNSPECIFIED) {
+if (target != AVCOL_RANGE_UNSPECIFIED)
+av_log(NULL, AV_LOG_WARNING,
+   "Incompatible color range '%s' for codec '%s', 
auto-selecting color range '%s'\n",
+   av_color_range_name(target),
+   codec->name,
+   av_color_range_name(codec->color_ranges[0]));
+return codec->color_ranges[0];
+}
+}
+return target;
+}
+
 void choose_sample_fmt(AVStream *st, AVCodec *codec)
 {
 if (codec && codec->sample_fmts) {
@@ -127,7 +149,19 @@ static char *choose_pix_fmts(OutputFilter *ofilter)
 return av_strdup(av_get_pix_fmt_name(ost->enc_ctx->pix_fmt));
 }
 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
-return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, 
ost->enc_ctx, ost->enc, ost->enc_ctx->pix_fmt)));
+AVIOContext *s = NULL;
+uint8_t *ret;
+int len;
+
+if (avio_open_dyn_buf() < 0)
+exit_program(1);
+
+avio_printf(s, "%s:%s", av_get_pix_fmt_name(choose_pixel_fmt(ost->st, 
ost->enc_ctx, ost->enc, ost->enc_ctx->pix_fmt)),
+
av_color_range_name(choose_color_range(ost->st, ost->enc_ctx, ost->enc, 
ost->enc_ctx->color_range)));
+
+len = avio_close_dyn_buf(s, );
+ret[len] = 0;
+return ret;
 } else if (ost->enc && ost->enc->pix_fmts) {
 const enum AVPixelFormat *p;
 AVIOContext *s = NULL;
@@ -144,7 +178,20 @@ static char *choose_pix_fmts(OutputFilter *ofilter)
 
 for (; *p != AV_PIX_FMT_NONE; p++) {
 const char *name = av_get_pix_fmt_name(*p);
-avio_printf(s, "%s|", name);
+avio_printf(s, "%s", name);
+if (*(p + 1) != AV_PIX_FMT_NONE)
+avio_printf(s, "|");
+else
+

Re: [FFmpeg-devel] [PATCH 07/25] avfilter: negotiate color_range between filters

2017-12-16 Thread Michael Niedermayer
On Sat, Dec 16, 2017 at 11:12:27AM +0100, Paul B Mahol wrote:
> Signed-off-by: Paul B Mahol 
> ---
>  fftools/ffmpeg.c|  2 ++
>  fftools/ffmpeg.h|  1 +
>  fftools/ffmpeg_filter.c | 57 +++---
>  fftools/ffmpeg_opt.c|  2 ++
>  libavcodec/utils.c  | 11 +++
>  libavfilter/avfilter.c  |  9 --
>  libavfilter/avfilter.h  |  4 ++-
>  libavfilter/avfiltergraph.c | 53 
>  libavfilter/buffersink.c| 16 ++
>  libavfilter/buffersink.h|  1 +
>  libavfilter/buffersrc.c |  4 +++
>  libavfilter/formats.c   | 75 
> ++---
>  libavfilter/formats.h   | 31 +++
>  libavfilter/internal.h  | 11 +++
>  libavfilter/vf_format.c | 46 ++-
>  libavfilter/vf_noise.c  |  6 +++-
>  libavfilter/vf_scale.c  | 17 --
>  libavfilter/vsrc_testsrc.c  | 15 +++--
>  tests/fate/filter-video.mak |  2 +-
>  tests/fate/pixlet.mak   |  2 +-
>  20 files changed, 343 insertions(+), 22 deletions(-)

This causes a segfault
./ffmpeg -f lavfi -i 
"amovie=fate-suite/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv,asplit=3[out1][a][b];
 [a]showwaves=s=340x240,pad=iw:ih*2[waves]; 
[b]showspectrum=s=340x240[spectrum]; [waves][spectrum] overlay=0:h [out0]"  -t 
0.1 -qscale 2 waves.avi


Program received signal SIGSEGV, Segmentation fault.
0x00476a7f in query_formats (graph=0x21d1f80, log_ctx=0x21d10e0) at 
libavfilter/avfiltergraph.c:607
607 av_assert0( inlink-> in_color_ranges->refcount > 0);
(gdb) bt
#0  0x00476a7f in query_formats (graph=0x21d1f80, log_ctx=0x21d10e0) at 
libavfilter/avfiltergraph.c:607
#1  0x004789ce in graph_config_formats (graph=0x21d1f80, 
log_ctx=0x21d10e0) at libavfilter/avfiltergraph.c:1216
#2  0x00478ea0 in avfilter_graph_config (graphctx=0x21d1f80, 
log_ctx=0x21d10e0) at libavfilter/avfiltergraph.c:1327
#3  0x004418ad in lavfi_read_header (avctx=0x21d10e0) at 
libavdevice/lavfi.c:302
#4  0x007c1acd in avformat_open_input (ps=0x7fffdbc0, 
filename=0x7fffe5d4 
"amovie=fate-suite/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv,asplit=3[out1][a][b];
 [a]showwaves=s=340x240,pad=iw:ih*2[waves]; 
[b]showspectrum=s=340x240[spectrum]"..., 
fmt=0x192be40 , options=0x21d0dc8) at 
libavformat/utils.c:600
#5  0x0041524f in open_input_file (o=0x7fffdcc0, 
filename=0x7fffe5d4 
"amovie=fate-suite/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv,asplit=3[out1][a][b];
 [a]showwaves=s=340x240,pad=iw:ih*2[waves]; 
[b]showspectrum=s=340x240[spectrum]"...)
at fftools/ffmpeg_opt.c:1070
#6  0x0041efb8 in open_files (l=0x21d0d78, inout=0x12004b7 "input", 
open_file=0x414903 ) at fftools/ffmpeg_opt.c:3299
#7  0x0041f14a in ffmpeg_parse_options (argc=10, argv=0x7fffe2d8) 
at fftools/ffmpeg_opt.c:3339
#8  0x0043d5fd in main (argc=10, argv=0x7fffe2d8) at 
fftools/ffmpeg.c:4818

[...]
-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

In fact, the RIAA has been known to suggest that students drop out
of college or go to community college in order to be able to afford
settlements. -- The RIAA


signature.asc
Description: PGP signature
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH 07/25] avfilter: negotiate color_range between filters

2017-12-16 Thread Paul B Mahol
Signed-off-by: Paul B Mahol 
---
 fftools/ffmpeg.c|  2 ++
 fftools/ffmpeg.h|  1 +
 fftools/ffmpeg_filter.c | 57 +++---
 fftools/ffmpeg_opt.c|  2 ++
 libavcodec/utils.c  | 11 +++
 libavfilter/avfilter.c  |  9 --
 libavfilter/avfilter.h  |  4 ++-
 libavfilter/avfiltergraph.c | 53 
 libavfilter/buffersink.c| 16 ++
 libavfilter/buffersink.h|  1 +
 libavfilter/buffersrc.c |  4 +++
 libavfilter/formats.c   | 75 ++---
 libavfilter/formats.h   | 31 +++
 libavfilter/internal.h  | 11 +++
 libavfilter/vf_format.c | 46 ++-
 libavfilter/vf_noise.c  |  6 +++-
 libavfilter/vf_scale.c  | 17 --
 libavfilter/vsrc_testsrc.c  | 15 +++--
 tests/fate/filter-video.mak |  2 +-
 tests/fate/pixlet.mak   |  2 +-
 20 files changed, 343 insertions(+), 22 deletions(-)

diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index 6aff3366c5..64de55d9a5 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -3390,6 +3390,8 @@ static int init_output_stream_encode(OutputStream *ost)
 enc_ctx->bits_per_raw_sample = FFMIN(dec_ctx->bits_per_raw_sample,
  
av_pix_fmt_desc_get(enc_ctx->pix_fmt)->comp[0].depth);
 
+enc_ctx->color_range = 
av_buffersink_get_color_range(ost->filter->filter);
+
 enc_ctx->framerate = ost->frame_rate;
 
 ost->st->avg_frame_rate = ost->frame_rate;
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 4e73d59082..071f3651f8 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -271,6 +271,7 @@ typedef struct OutputFilter {
 
 /* desired output stream properties */
 int width, height;
+enum AVColorRange color_range;
 AVRational frame_rate;
 int format;
 int sample_rate;
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
index 877fd670e6..16ad79625b 100644
--- a/fftools/ffmpeg_filter.c
+++ b/fftools/ffmpeg_filter.c
@@ -89,6 +89,28 @@ enum AVPixelFormat choose_pixel_fmt(AVStream *st, 
AVCodecContext *enc_ctx, AVCod
 return target;
 }
 
+static enum AVColorRange choose_color_range(AVStream *st, AVCodecContext 
*enc_ctx, AVCodec *codec, enum AVColorRange target)
+{
+if (codec && codec->color_ranges) {
+const enum AVColorRange *p = codec->color_ranges;
+
+for (; *p != AVCOL_RANGE_UNSPECIFIED; p++) {
+if (*p == target)
+break;
+}
+if (*p == AVCOL_RANGE_UNSPECIFIED) {
+if (target != AVCOL_RANGE_UNSPECIFIED)
+av_log(NULL, AV_LOG_WARNING,
+   "Incompatible color range '%s' for codec '%s', 
auto-selecting color range '%s'\n",
+   av_color_range_name(target),
+   codec->name,
+   av_color_range_name(codec->color_ranges[0]));
+return codec->color_ranges[0];
+}
+}
+return target;
+}
+
 void choose_sample_fmt(AVStream *st, AVCodec *codec)
 {
 if (codec && codec->sample_fmts) {
@@ -127,7 +149,19 @@ static char *choose_pix_fmts(OutputFilter *ofilter)
 return av_strdup(av_get_pix_fmt_name(ost->enc_ctx->pix_fmt));
 }
 if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
-return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, 
ost->enc_ctx, ost->enc, ost->enc_ctx->pix_fmt)));
+AVIOContext *s = NULL;
+uint8_t *ret;
+int len;
+
+if (avio_open_dyn_buf() < 0)
+exit_program(1);
+
+avio_printf(s, "%s:%s", av_get_pix_fmt_name(choose_pixel_fmt(ost->st, 
ost->enc_ctx, ost->enc, ost->enc_ctx->pix_fmt)),
+
av_color_range_name(choose_color_range(ost->st, ost->enc_ctx, ost->enc, 
ost->enc_ctx->color_range)));
+
+len = avio_close_dyn_buf(s, );
+ret[len] = 0;
+return ret;
 } else if (ost->enc && ost->enc->pix_fmts) {
 const enum AVPixelFormat *p;
 AVIOContext *s = NULL;
@@ -144,7 +178,20 @@ static char *choose_pix_fmts(OutputFilter *ofilter)
 
 for (; *p != AV_PIX_FMT_NONE; p++) {
 const char *name = av_get_pix_fmt_name(*p);
-avio_printf(s, "%s|", name);
+avio_printf(s, "%s", name);
+if (*(p + 1) != AV_PIX_FMT_NONE)
+avio_printf(s, "|");
+else
+avio_printf(s, ":");
+}
+
+if (ost->enc->color_ranges) {
+const enum AVColorRange *c = ost->enc->color_ranges;
+
+for (; *c != AVCOL_RANGE_UNSPECIFIED; c++) {
+const char *name = av_color_range_name(*c);
+avio_printf(s, "%s|", name);
+}
 }
 len = avio_close_dyn_buf(s, );
 ret[len - 1] = 0;
@@ -777,10 +824,11 @@ static int