Re: [FFmpeg-devel] [PATCH 07/25] avfilter: negotiate color_range between filters
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
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
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
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