Re: [FFmpeg-devel] [PATCH] Avoid using the --preprocessor argument to windres

2021-06-18 Thread Martin Storsjö

On Thu, 17 Jun 2021, Martin Storsjö wrote:


On Mon, 14 Jun 2021, Martin Storsjö wrote:


Instead use --preprocessor-arg; in binutils 2.36, the --preprocessor
flag was changed so that it no longer accepts a string containing
multiple arguments, but the whole --preprocessor argument is
treated as the path to the preprocessor executable (where the path
can contain spaces).

It's currently unclear whether this behaviour will stay or if it
is going to be reverted in the future, see discussion at [1]. Just
to be safe, avoid using the --preprocessor argument. Don't redeclare
the full preprocessing command, but just add the $(CC_DEPFLAGS) options.

Based on a patch by Kyle Schwartz.

[1] https://sourceware.org/bugzilla/show_bug.cgi?id=27594
---
configure  | 1 -
ffbuild/common.mak | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)



OK'd by James Almer on irc, will push a bit later.


Pushed now.

I'll backport it to a couple older releases too, maybe next week (to let 
it sit in master for a little while first).


// Martin
___
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".


Re: [FFmpeg-devel] [PATCH] avfilter/select: evaluate silencedetect metadata

2021-06-18 Thread Timo Rothenpieler

On 18.06.2021 06:19, Gyan Doshi wrote:
Instead of a specific option for silencedetect, it would be future-proof 
if it was an option called, say, metadata with a constant for 
silencedetect to start with.
There are multiple per-frame analysis filters like blackframe, 
blackdetect, freezedetect..etc and it will be easier to just extend 
'metadata' with new constants

than to add a new option for each filter.


The only issue I see with that is a loss of flexibility.
I does not seem like you can pass parameters to variables in the 
expression syntax.

So there would need to be two new parameters for the select filter itself.
The start and the end marker metadata name.

But what if a user wanted to combine multiple detection filters?
I guess chaining multiple select filters would work, but can be pretty 
annoying, depending on the usecase.




smime.p7s
Description: S/MIME Cryptographic Signature
___
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".


Re: [FFmpeg-devel] [PATCH] avfilter/select: evaluate silencedetect metadata

2021-06-18 Thread Gyan Doshi




On 2021-06-18 17:02, Timo Rothenpieler wrote:

On 18.06.2021 06:19, Gyan Doshi wrote:
Instead of a specific option for silencedetect, it would be 
future-proof if it was an option called, say, metadata with a 
constant for silencedetect to start with.
There are multiple per-frame analysis filters like blackframe, 
blackdetect, freezedetect..etc and it will be easier to just extend 
'metadata' with new constants

than to add a new option for each filter.


The only issue I see with that is a loss of flexibility.
I does not seem like you can pass parameters to variables in the 
expression syntax.
So there would need to be two new parameters for the select filter 
itself.

The start and the end marker metadata name.

But what if a user wanted to combine multiple detection filters?
I guess chaining multiple select filters would work, but can be pretty 
annoying, depending on the usecase.


Yes, ideally, we would associate a function for metadata that allows it 
to be used flexibly within the expr.


See how drawtext text parameter can accommodate various functions. 
There's a limited example (last one) at 
http://www.ffmpeg.org/ffmpeg-filters.html#Examples-62


Regards,
Gyan
___
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".


Re: [FFmpeg-devel] [PATCH] avfilter/select: evaluate silencedetect metadata

2021-06-18 Thread Timo Rothenpieler

On 18.06.2021 13:46, Gyan Doshi wrote:



On 2021-06-18 17:02, Timo Rothenpieler wrote:

On 18.06.2021 06:19, Gyan Doshi wrote:
Instead of a specific option for silencedetect, it would be 
future-proof if it was an option called, say, metadata with a 
constant for silencedetect to start with.
There are multiple per-frame analysis filters like blackframe, 
blackdetect, freezedetect..etc and it will be easier to just extend 
'metadata' with new constants

than to add a new option for each filter.


The only issue I see with that is a loss of flexibility.
I does not seem like you can pass parameters to variables in the 
expression syntax.
So there would need to be two new parameters for the select filter 
itself.

The start and the end marker metadata name.

But what if a user wanted to combine multiple detection filters?
I guess chaining multiple select filters would work, but can be pretty 
annoying, depending on the usecase.


Yes, ideally, we would associate a function for metadata that allows it 
to be used flexibly within the expr.


See how drawtext text parameter can accommodate various functions. 
There's a limited example (last one) at 
http://www.ffmpeg.org/ffmpeg-filters.html#Examples-62


The drawtext filter does not use expression evaluation for its text 
parameter.

It implements its own logic for that, and it's purely text-replace.

The expression parser does support functions, but only functions with 
one or two numeric arguments.
So it'll have to be something like detected(silence) and then silence is 
a constant numeric variable that the detected function resolves to the 
specific metadata names.




smime.p7s
Description: S/MIME Cryptographic Signature
___
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".


Re: [FFmpeg-devel] [PATCH] avfilter/select: evaluate silencedetect metadata

2021-06-18 Thread Gyan Doshi



On 2021-06-18 17:27, Timo Rothenpieler wrote:

On 18.06.2021 13:46, Gyan Doshi wrote:



On 2021-06-18 17:02, Timo Rothenpieler wrote:

On 18.06.2021 06:19, Gyan Doshi wrote:
Instead of a specific option for silencedetect, it would be 
future-proof if it was an option called, say, metadata with a 
constant for silencedetect to start with.
There are multiple per-frame analysis filters like blackframe, 
blackdetect, freezedetect..etc and it will be easier to just extend 
'metadata' with new constants

than to add a new option for each filter.


The only issue I see with that is a loss of flexibility.
I does not seem like you can pass parameters to variables in the 
expression syntax.
So there would need to be two new parameters for the select filter 
itself.

The start and the end marker metadata name.

But what if a user wanted to combine multiple detection filters?
I guess chaining multiple select filters would work, but can be 
pretty annoying, depending on the usecase.


Yes, ideally, we would associate a function for metadata that allows 
it to be used flexibly within the expr.


See how drawtext text parameter can accommodate various functions. 
There's a limited example (last one) at 
http://www.ffmpeg.org/ffmpeg-filters.html#Examples-62


The drawtext filter does not use expression evaluation for its text 
parameter.

It implements its own logic for that, and it's purely text-replace.

The expression parser does support functions, but only functions with 
one or two numeric arguments.
So it'll have to be something like detected(silence) and then silence 
is a constant numeric variable that the detected function resolves to 
the specific metadata names.


Yeah, so I guess this patch can go ahead as-is, and I'll look into 
extending eval with a  metadata(key)   function for a generic facility.


Regards,
Gyan
___
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".


Re: [FFmpeg-devel] [PATCH] avfilter/select: evaluate silencedetect metadata

2021-06-18 Thread Timo Rothenpieler

On 18.06.2021 14:35, Gyan Doshi wrote:
The drawtext filter does not use expression evaluation for its text 
parameter.

It implements its own logic for that, and it's purely text-replace.

The expression parser does support functions, but only functions with 
one or two numeric arguments.
So it'll have to be something like detected(silence) and then silence 
is a constant numeric variable that the detected function resolves to 
the specific metadata names.


Yeah, so I guess this patch can go ahead as-is, and I'll look into 
extending eval with a  metadata(key)   function for a generic facility.


I don't think this can be easily added to the expression parser, since 
it needs to keep track of the internal state.

Various kinds of metadatas work very differently as well.

I'm almost finished changing this patch to a more generic way, where new 
detection filters that follow the principle of silencedetect can be 
added easily.




smime.p7s
Description: S/MIME Cryptographic Signature
___
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] [PATCH] avfilter/select: add metadata detection function

2021-06-18 Thread Timo Rothenpieler
---
 doc/filters.texi   | 18 ++
 libavfilter/f_select.c | 79 --
 libavfilter/version.h  |  2 +-
 3 files changed, 96 insertions(+), 3 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index da8f7d7726..05fec04b55 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -5404,6 +5404,7 @@ Set sidechain gain. Default is 1. Range is from 0.015625 
to 64.
 
 This filter supports the all above options as @ref{commands}.
 
+@anchor{silencedetect}
 @section silencedetect
 
 Detect silence in an audio stream.
@@ -7263,6 +7264,7 @@ Filter out noisy pixels from @code{bitplane} set above.
 Default is disabled.
 @end table
 
+@anchor{blackdetect}
 @section blackdetect
 
 Detect video intervals that are (almost) completely black. Can be
@@ -12518,6 +12520,7 @@ Select frame after every @code{step} frames.
 Allowed values are positive integers higher than 0. Default value is @code{1}.
 @end table
 
+@anchor{freezedetect}
 @section freezedetect
 
 Detect frozen video.
@@ -25564,6 +25567,21 @@ missing.
 That basically means that an input frame is selected if its pts is within the
 interval set by the concat demuxer.
 
+@item detected(kind)
+Evaluates the metadata added to frames by various detection filters.
+Returns -1 if the respective filter has detected what it was looking for,
+0 otherwise.
+
+Possible values for the @var{kind} parameter:
+@table @option
+@item SILENCE (audio only)
+Looks for metadata added by @ref{silencedetect}.
+@item FREEZE (video only)
+Looks for metadata added by @ref{freezedetect}.
+@item BLACK (video only)
+Looks for metadata added by @ref{blackdetect}.
+@end table
+
 @end table
 
 The default value of the select expression is "1".
diff --git a/libavfilter/f_select.c b/libavfilter/f_select.c
index f0468078e8..b1eba67876 100644
--- a/libavfilter/f_select.c
+++ b/libavfilter/f_select.c
@@ -86,6 +86,10 @@ static const char *const var_names[] = {
 
 "concatdec_select",  ///< frame is within the interval set by the concat 
demuxer
 
+"SILENCE",   ///< silencedetect detected silence for this frame
+"FREEZE",///< freezedetect detected frozen frames
+"BLACK", ///< blackdetect detected black frames
+
 NULL
 };
 
@@ -138,14 +142,42 @@ enum var_name {
 
 VAR_CONCATDEC_SELECT,
 
+VAR_SILENCE,
+VAR_FREEZE,
+VAR_BLACK,
+
 VAR_VARS_NB
 };
 
+enum meta_name {
+META_SILENCE,
+META_FREEZE,
+META_BLACK,
+
+META_NAMES_NB
+};
+
+static const char *const func1_names[] = {
+"detected", ///< function to eval metadata from various detection filters 
(silencedetect, ...)
+
+NULL
+};
+
+static double detect_metadata(void *p, double kind);
+
+static double (*func1_funcs[])(void *, double) = {
+detect_metadata,
+
+NULL
+};
+
 typedef struct SelectContext {
 const AVClass *class;
 char *expr_str;
 AVExpr *expr;
 double var_values[VAR_VARS_NB];
+int meta_detected[META_NAMES_NB];
+AVFrame *cur_frame; ///< current frame, for use in expression 
parser functions ONLY
 int bitdepth;
 int nb_planes;
 ptrdiff_t width[4];
@@ -177,7 +209,7 @@ static av_cold int init(AVFilterContext *ctx)
 int i, ret;
 
 if ((ret = av_expr_parse(&select->expr, select->expr_str,
- var_names, NULL, NULL, NULL, NULL, 0, ctx)) < 0) {
+ var_names, func1_names, func1_funcs, NULL, NULL, 
0, ctx)) < 0) {
 av_log(ctx, AV_LOG_ERROR, "Error while parsing expression '%s'\n",
select->expr_str);
 return ret;
@@ -267,6 +299,11 @@ static int config_input(AVFilterLink *inlink)
 if (!select->sad)
 return AVERROR(EINVAL);
 }
+
+select->var_values[VAR_SILENCE] = META_SILENCE;
+select->var_values[VAR_FREEZE]  = META_FREEZE;
+select->var_values[VAR_BLACK]   = META_BLACK;
+
 return 0;
 }
 
@@ -325,6 +362,40 @@ static double get_concatdec_select(AVFrame *frame, int64_t 
pts)
 return NAN;
 }
 
+static double detect_metadata(void *p, double kind)
+{
+AVFilterContext *ctx = p;
+SelectContext *select = ctx->priv;
+AVDictionary *metadata = select->cur_frame->metadata;
+int kind_i = (int)(kind + 0.5);
+const char *start, *end;
+
+switch(kind_i) {
+case META_SILENCE:
+start = "lavfi.silence_start";
+end = "lavfi.silence_end";
+break;
+case META_FREEZE:
+start = "lavfi.freezedetect.freeze_start";
+end = "lavfi.freezedetect.freeze_end";
+break;
+case META_BLACK:
+start = "lavfi.black_start";
+end = "lavfi.black_end";
+break;
+default:
+av_log(ctx, AV_LOG_WARNING, "Invalid metadata detection kind!\n");
+return NAN;
+}
+
+if (av_dict_get(metadata, start, NULL, 0))
+select->meta_detected[kind_i] = -1;
+if (av_dict_get(metadata, end, NULL, 0))
+select->meta_detected[kind_i] = 0;
+
+  

Re: [FFmpeg-devel] [PATCH] lavfi/dnn_backend_openvino.c: Fix Memory Leak for RequestItem

2021-06-18 Thread Guo, Yejun


> -Original Message-
> From: ffmpeg-devel  On Behalf Of
> Shubhanshu Saxena
> Sent: 2021年6月15日 1:56
> To: ffmpeg-devel@ffmpeg.org
> Cc: Shubhanshu Saxena 
> Subject: [FFmpeg-devel] [PATCH] lavfi/dnn_backend_openvino.c: Fix
> Memory Leak for RequestItem
> 
> Fix memory leak for RequestItem upon error while pushing to the
> request_queue in the completion callback.
> 
> Signed-off-by: Shubhanshu Saxena 
> ---
>  libavfilter/dnn/dnn_backend_openvino.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/libavfilter/dnn/dnn_backend_openvino.c
> b/libavfilter/dnn/dnn_backend_openvino.c
> index 709a772a4d..702c4fb9ee 100644
> --- a/libavfilter/dnn/dnn_backend_openvino.c
> +++ b/libavfilter/dnn/dnn_backend_openvino.c
> @@ -293,6 +293,8 @@ static void infer_completion_callback(void *args)
> 
>  request->inference_count = 0;
>  if (ff_safe_queue_push_back(requestq, request) < 0) {
> +ie_infer_request_free(&request->infer_request);
> +av_freep(&request);
>  av_log(ctx, AV_LOG_ERROR, "Failed to push back request_queue.\n");
>  return;
>  }
LGTM, will push soon, thanks.
___
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".


Re: [FFmpeg-devel] [PATCH] lavfi/dnn_backend_openvino.c: fix crash when target is not specified

2021-06-18 Thread Guo, Yejun


> -Original Message-
> From: Guo, Yejun 
> Sent: 2021年6月13日 22:43
> To: ffmpeg-devel@ffmpeg.org
> Cc: Guo, Yejun 
> Subject: [PATCH] lavfi/dnn_backend_openvino.c: fix crash when target is not
> specified
> 
> ---
>  libavfilter/dnn/dnn_backend_openvino.c | 6 --
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/libavfilter/dnn/dnn_backend_openvino.c
> b/libavfilter/dnn/dnn_backend_openvino.c
> index 709a772a4d..dee0a8e047 100644
> --- a/libavfilter/dnn/dnn_backend_openvino.c
> +++ b/libavfilter/dnn/dnn_backend_openvino.c
> @@ -596,8 +596,10 @@ static DNNReturnType
> extract_inference_from_task(DNNFunctionType func_type, Task
>  InferenceItem *inference;
>  const AVDetectionBBox *bbox = av_get_detection_bbox(header, i);
> 
> -if (av_strncasecmp(bbox->detect_label, params->target, 
> sizeof(bbox-
> >detect_label)) != 0) {
> -continue;
> +if (params->target) {
> +if (av_strncasecmp(bbox->detect_label, params->target,
> sizeof(bbox->detect_label)) != 0) {
> +continue;
> +}
>  }
> 
>  inference = av_malloc(sizeof(*inference));

Will push tomorrow if there's no objection, thanks.

___
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] [PATCH] web: add news about IRC move (stolen from twitter)

2021-06-18 Thread Michael Niedermayer
Feel free to suggest better wording

Signed-off-by: Michael Niedermayer 
---
 src/index | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/src/index b/src/index
index e456ed2..3f2dfa5 100644
--- a/src/index
+++ b/src/index
@@ -35,6 +35,13 @@
 News
   
 
+  June 18th, 2021, IRC
+  
+We have a new IRC home at @liberachat
+now! Feel free to join us at #ffmpeg and #ffmpeg-devel. Unsure About 
channel? More info at https://ffmpeg.org/contact.html#IRCChannels";>contact#IRCChannels
+  
+
+
   April 8th, 2021, FFmpeg 4.4 "Rao"
   
 FFmpeg 4.4 "Rao", a new
-- 
2.17.1

___
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".


Re: [FFmpeg-devel] [PATCH v3] avformat/libsrt: log streamid in listener mode

2021-06-18 Thread zhilizhao(赵志立)
Ping for review, thanks!

> On Jun 10, 2021, at 11:58 AM, Zhao Zhili  wrote:
> 
> It's useful for test client which pass streamid to ffmpeg/ffplay.
> For example, use ffmpeg to test streamid support in VLC:
> ./ffmpeg -v info -re -i foo.mp4 -c copy -f mpegts -mode listener 
> srt://127.0.0.1:9000
> ./vlc srt://127.0.0.1:9000?streamid=foobar
> ---
> v3:
> Don't zero out streamid.
> Fix streamid array size (512 -> 513).
> 
> v2:
> Avoid forward declaration.
> Use AV_LOG_VERBOSE.
> 
> libavformat/libsrt.c | 24 +++-
> 1 file changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c
> index 8dee6aa3f3..a4285ca294 100644
> --- a/libavformat/libsrt.c
> +++ b/libavformat/libsrt.c
> @@ -156,6 +156,15 @@ static int libsrt_neterrno(URLContext *h)
> return os_errno ? AVERROR(os_errno) : AVERROR_UNKNOWN;
> }
> 
> +static int libsrt_getsockopt(URLContext *h, int fd, SRT_SOCKOPT optname, 
> const char * optnamestr, void * optval, int * optlen)
> +{
> +if (srt_getsockopt(fd, 0, optname, optval, optlen) < 0) {
> +av_log(h, AV_LOG_ERROR, "failed to get option %s on socket: %s\n", 
> optnamestr, srt_getlasterror_str());
> +return AVERROR(EIO);
> +}
> +return 0;
> +}
> +
> static int libsrt_socket_nonblock(int socket, int enable)
> {
> int ret, blocking = enable ? 0 : 1;
> @@ -227,6 +236,9 @@ static int libsrt_listen(int eid, int fd, const struct 
> sockaddr *addr, socklen_t
> {
> int ret;
> int reuse = 1;
> +/* Max streamid length plus an extra space for the terminating null 
> character */
> +char streamid[513];
> +int streamid_len = sizeof(streamid);
> if (srt_setsockopt(fd, SOL_SOCKET, SRTO_REUSEADDR, &reuse, 
> sizeof(reuse))) {
> av_log(h, AV_LOG_WARNING, "setsockopt(SRTO_REUSEADDR) failed\n");
> }
> @@ -245,6 +257,9 @@ static int libsrt_listen(int eid, int fd, const struct 
> sockaddr *addr, socklen_t
> return libsrt_neterrno(h);
> if (libsrt_socket_nonblock(ret, 1) < 0)
> av_log(h, AV_LOG_DEBUG, "libsrt_socket_nonblock failed\n");
> +if (!libsrt_getsockopt(h, ret, SRTO_STREAMID, "SRTO_STREAMID", streamid, 
> &streamid_len))
> +/* Note: returned streamid_len doesn't count the terminating null 
> character */
> +av_log(h, AV_LOG_VERBOSE, "accept streamid [%s], length %d\n", 
> streamid, streamid_len);
> 
> return ret;
> }
> @@ -279,15 +294,6 @@ static int libsrt_setsockopt(URLContext *h, int fd, 
> SRT_SOCKOPT optname, const c
> return 0;
> }
> 
> -static int libsrt_getsockopt(URLContext *h, int fd, SRT_SOCKOPT optname, 
> const char * optnamestr, void * optval, int * optlen)
> -{
> -if (srt_getsockopt(fd, 0, optname, optval, optlen) < 0) {
> -av_log(h, AV_LOG_ERROR, "failed to get option %s on socket: %s\n", 
> optnamestr, srt_getlasterror_str());
> -return AVERROR(EIO);
> -}
> -return 0;
> -}
> -
> /* - The "POST" options can be altered any time on a connected socket.
>  They MAY have also some meaning when set prior to connecting; such
>  option is SRTO_RCVSYN, which makes connect/accept call asynchronous.
> -- 
> 2.31.1
> 
> ___
> 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".


Re: [FFmpeg-devel] [PATCH 1/2] avformat/libsrt: support bidirectional transmission

2021-06-18 Thread zhilizhao(赵志立)
Ping again.

> On Jun 10, 2021, at 12:13 PM, zhilizhao(赵志立)  wrote:
> 
> Ping for review, thanks!
> 
>> On May 19, 2021, at 12:03 AM, Zhao Zhili  wrote:
>> 
>> ---
>> There is no good use case yet. Patch 2/2 is only used for test.
>> 
>> libavformat/libsrt.c | 35 +++
>> 1 file changed, 27 insertions(+), 8 deletions(-)
>> 
>> diff --git a/libavformat/libsrt.c b/libavformat/libsrt.c
>> index c1e96f700e..a05921d9f0 100644
>> --- a/libavformat/libsrt.c
>> +++ b/libavformat/libsrt.c
>> @@ -163,10 +163,17 @@ static int libsrt_socket_nonblock(int socket, int 
>> enable)
>>return srt_setsockopt(socket, 0, SRTO_RCVSYN, &blocking, 
>> sizeof(blocking));
>> }
>> 
>> -static int libsrt_epoll_create(URLContext *h, int fd, int write)
>> +static int libsrt_epoll_create(URLContext *h, int fd, int flags)
>> {
>> -int modes = SRT_EPOLL_ERR | (write ? SRT_EPOLL_OUT : SRT_EPOLL_IN);
>> -int eid = srt_epoll_create();
>> +int modes;
>> +int eid;
>> +
>> +modes = SRT_EPOLL_ERR;
>> +if (flags & AVIO_FLAG_WRITE)
>> +modes |= SRT_EPOLL_OUT;
>> +if (flags & AVIO_FLAG_READ)
>> +modes |= SRT_EPOLL_IN;
>> +eid = srt_epoll_create();
>>if (eid < 0)
>>return libsrt_neterrno(h);
>>if (srt_epoll_add_usock(eid, fd, &modes) < 0) {
>> @@ -178,14 +185,26 @@ static int libsrt_epoll_create(URLContext *h, int fd, 
>> int write)
>> 
>> static int libsrt_network_wait_fd(URLContext *h, int eid, int write)
>> {
>> -int ret, len = 1, errlen = 1;
>> +int ret, len = 1, errlen;
>>SRTSOCKET ready[1];
>>SRTSOCKET error[1];
>> +SRTSOCKET *error_ptr;
>> +int *errlen_ptr;
>> +if ((h->flags & AVIO_FLAG_READ_WRITE) == AVIO_FLAG_READ_WRITE) {
>> +// cannot detect error in this case
>> +errlen = 0;
>> +error_ptr = NULL;
>> +errlen_ptr = NULL;
>> +} else {
>> +errlen = 1;
>> +error_ptr = error;
>> +errlen_ptr = &errlen;
>> +}
>> 
>>if (write) {
>> -ret = srt_epoll_wait(eid, error, &errlen, ready, &len, 
>> POLLING_TIME, 0, 0, 0, 0);
>> +ret = srt_epoll_wait(eid, error_ptr, errlen_ptr, ready, &len, 
>> POLLING_TIME, 0, 0, 0, 0);
>>} else {
>> -ret = srt_epoll_wait(eid, ready, &len, error, &errlen, 
>> POLLING_TIME, 0, 0, 0, 0);
>> +ret = srt_epoll_wait(eid, ready, &len, error_ptr, errlen_ptr, 
>> POLLING_TIME, 0, 0, 0, 0);
>>}
>>if (ret < 0) {
>>if (srt_getlasterror(NULL) == SRT_ETIMEOUT)
>> @@ -435,7 +454,7 @@ static int libsrt_setup(URLContext *h, const char *uri, 
>> int flags)
>>if (libsrt_socket_nonblock(fd, 1) < 0)
>>av_log(h, AV_LOG_DEBUG, "libsrt_socket_nonblock failed\n");
>> 
>> -ret = write_eid = libsrt_epoll_create(h, fd, 1);
>> +ret = write_eid = libsrt_epoll_create(h, fd, AVIO_FLAG_WRITE);
>>if (ret < 0)
>>goto fail1;
>>if (s->mode == SRT_MODE_LISTENER) {
>> @@ -479,7 +498,7 @@ static int libsrt_setup(URLContext *h, const char *uri, 
>> int flags)
>>h->max_packet_size = packet_size;
>>}
>> 
>> -ret = eid = libsrt_epoll_create(h, fd, flags & AVIO_FLAG_WRITE);
>> +ret = eid = libsrt_epoll_create(h, fd, flags);
>>if (eid < 0)
>>goto fail1;
>> 
>> -- 
>> 2.25.1
>> 
>> ___
>> 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".
> 

___
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] [PATCH V3] lavf/vf_ocr: add subregion support

2021-06-18 Thread Lingjiang Fang


fix doc errors, ping for review, thanks :)
---
 doc/filters.texi |  8 
 libavfilter/vf_ocr.c | 35 ++-
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index da8f7d7726..041fd28c57 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -15451,6 +15451,14 @@ Set character whitelist.
 
 @item blacklist
 Set character blacklist.
+
+@item x, y
+Set top-left corner of the subregion, in pixels, default is (0,0).
+
+@item w, h
+Set width and height of the subregion, in pixels,
+default is the bottom-right part from given top-left corner.
+
 @end table
 
 The filter exports recognized text as the frame metadata @code{lavfi.ocr.text}.
diff --git a/libavfilter/vf_ocr.c b/libavfilter/vf_ocr.c
index 6de474025a..e96dce2d87 100644
--- a/libavfilter/vf_ocr.c
+++ b/libavfilter/vf_ocr.c
@@ -33,6 +33,8 @@ typedef struct OCRContext {
 char *language;
 char *whitelist;
 char *blacklist;
+int x, y;
+int w, h;
 
 TessBaseAPI *tess;
 } OCRContext;
@@ -45,6 +47,10 @@ static const AVOption ocr_options[] = {
 { "language",  "set language",OFFSET(language),  
AV_OPT_TYPE_STRING, {.str="eng"}, 0, 0, FLAGS },
 { "whitelist", "set character whitelist", OFFSET(whitelist), 
AV_OPT_TYPE_STRING, 
{.str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.:;,-+_!?\"'[]{}()<>|/\\=*&%$#@!~
 "}, 0, 0, FLAGS },
 { "blacklist", "set character blacklist", OFFSET(blacklist), 
AV_OPT_TYPE_STRING, {.str=""},0, 0, FLAGS },
+{ "x", "top x of sub region", OFFSET(x), 
AV_OPT_TYPE_INT,{.i64=0}, 0, INT_MAX, FLAGS },
+{ "y", "top y of sub region", OFFSET(y), 
AV_OPT_TYPE_INT,{.i64=0}, 0, INT_MAX, FLAGS },
+{ "w", "width of sub region", OFFSET(w), 
AV_OPT_TYPE_INT,{.i64=0}, 0, INT_MAX, FLAGS },
+{ "h", "height of sub region",OFFSET(h), 
AV_OPT_TYPE_INT,{.i64=0}, 0, INT_MAX, FLAGS },
 { NULL }
 };
 
@@ -93,6 +99,21 @@ static int query_formats(AVFilterContext *ctx)
 return ff_set_common_formats(ctx, fmts_list);
 }
 
+static void check_fix(int *x, int *y, int *w, int *h, int pic_w, int pic_h)
+{
+// 0 <= x < pic_w
+if (*x >= pic_w)
+*x = 0;
+// 0 <= y < pic_h
+if (*y >= pic_h)
+*y = 0;
+
+if (*w == 0 || *w + *x > pic_w)
+*w = pic_w - *x;
+if (*h == 0 || *h + *y > pic_h)
+*h = pic_h - *y;
+}
+
 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 {
 AVDictionary **metadata = &in->metadata;
@@ -102,8 +123,20 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
 char *result;
 int *confs;
 
+// TODO(vacing): support expression
+int x = s->x;
+int y = s->y;
+int w = s->w;
+int h = s->h;
+check_fix(&x, &y, &w, &h, in->width, in->height);
+if ( x != s->x || y != s->y  ||
+(s->w != 0 && w != s->w) || (s->h != 0 && h != s->h)) {
+av_log(s, AV_LOG_WARNING, "config error, subregion changed to x=%d, 
y=%d, w=%d, h=%d\n",
+x, y, w, 
h);
+}
+
 result = TessBaseAPIRect(s->tess, in->data[0], 1,
- in->linesize[0], 0, 0, in->width, in->height);
+ in->linesize[0], x, y, w, h);
 confs = TessBaseAPIAllWordConfidences(s->tess);
 av_dict_set(metadata, "lavfi.ocr.text", result, 0);
 for (int i = 0; confs[i] != -1; i++) {
-- 
2.29.2

___
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] [PATCH] lavfi/dnn_backend_openvino.c: Fix Memory Leak in execute_model_ov

2021-06-18 Thread Shubhanshu Saxena
In cases where the execution inside the function execute_model_ov fails,
push the RequestItem back to the request_queue before returning the error.
In case pushing back fails, release the allocated memory.

Signed-off-by: Shubhanshu Saxena 
---
 libavfilter/dnn/dnn_backend_openvino.c | 12 +---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/libavfilter/dnn/dnn_backend_openvino.c 
b/libavfilter/dnn/dnn_backend_openvino.c
index 702c4fb9ee..29ec8f6a8f 100644
--- a/libavfilter/dnn/dnn_backend_openvino.c
+++ b/libavfilter/dnn/dnn_backend_openvino.c
@@ -448,12 +448,12 @@ static DNNReturnType execute_model_ov(RequestItem 
*request, Queue *inferenceq)
 status = ie_infer_set_completion_callback(request->infer_request, 
&request->callback);
 if (status != OK) {
 av_log(ctx, AV_LOG_ERROR, "Failed to set completion callback for 
inference\n");
-return DNN_ERROR;
+goto err;
 }
 status = ie_infer_request_infer_async(request->infer_request);
 if (status != OK) {
 av_log(ctx, AV_LOG_ERROR, "Failed to start async inference\n");
-return DNN_ERROR;
+goto err;
 }
 return DNN_SUCCESS;
 } else {
@@ -464,11 +464,17 @@ static DNNReturnType execute_model_ov(RequestItem 
*request, Queue *inferenceq)
 status = ie_infer_request_infer(request->infer_request);
 if (status != OK) {
 av_log(ctx, AV_LOG_ERROR, "Failed to start synchronous model 
inference\n");
-return DNN_ERROR;
+goto err;
 }
 infer_completion_callback(request);
 return (task->inference_done == task->inference_todo) ? DNN_SUCCESS : 
DNN_ERROR;
 }
+err:
+if (ff_safe_queue_push_back(ov_model->request_queue, request) < 0) {
+ie_infer_request_free(&request->infer_request);
+av_freep(&request);
+}
+return DNN_ERROR;
 }
 
 static DNNReturnType get_input_ov(void *model, DNNData *input, const char 
*input_name)
-- 
2.25.1

___
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".


Re: [FFmpeg-devel] [PATCH] Update missed irc links

2021-06-18 Thread Michael Niedermayer
On Thu, Jun 17, 2021 at 06:20:08PM -0300, James Almer wrote:
> On 6/17/2021 6:01 PM, Michael Niedermayer wrote:
> > Signed-off-by: Michael Niedermayer 
> > ---
> >   configure   | 2 +-
> >   doc/writing_filters.txt | 2 +-
> >   2 files changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/configure b/configure
> > index 6bfd98b384..ecdcebf21c 100755
> > --- a/configure
> > +++ b/configure
> > @@ -534,7 +534,7 @@ die(){
> >   If you think configure made a mistake, make sure you are using the latest
> >   version from Git.  If the latest version fails, report the problem to the
> > -ffmpeg-u...@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
> > +ffmpeg-u...@ffmpeg.org mailing list or IRC #ffmpeg on irc.libera.chat.
> >   EOF
> >   if disabled logging; then
> >   cat < > diff --git a/doc/writing_filters.txt b/doc/writing_filters.txt
> > index 2e25cbed71..e89d7d1e05 100644
> > --- a/doc/writing_filters.txt
> > +++ b/doc/writing_filters.txt
> > @@ -418,4 +418,4 @@ done:
> >   When all of this is done, you can submit your patch to the ffmpeg-devel
> >   mailing-list for review.  If you need any help, feel free to come on our 
> > IRC
> > -channel, #ffmpeg-devel on irc.freenode.net.
> > +channel, #ffmpeg-devel on irc.libera.chat.
> 
> LGMT, please push and backport to all supported branches ASAP. It's
> imperative we stop directing people to Freenode after the database purge two
> days ago.

done master & release/4.4
ive done the other branches locally too but they need more testing and some
need fixes before i can push them. So if you want you can backport it to other 
branches
note the release/4.4 version has a extra line compared to master 

thx

[...]

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

No snowflake in an avalanche ever feels responsible. -- Voltaire


signature.asc
Description: PGP signature
___
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".


Re: [FFmpeg-devel] [PATCH] web: add news about IRC move (stolen from twitter)

2021-06-18 Thread James Almer

On 6/18/2021 11:18 AM, Michael Niedermayer wrote:

Feel free to suggest better wording

Signed-off-by: Michael Niedermayer 
---
  src/index | 7 +++
  1 file changed, 7 insertions(+)

diff --git a/src/index b/src/index
index e456ed2..3f2dfa5 100644
--- a/src/index
+++ b/src/index
@@ -35,6 +35,13 @@
  News

  
+  June 18th, 2021, IRC

+  
+We have a new IRC home at @liberachat
+now! Feel free to join us at #ffmpeg and #ffmpeg-devel. Unsure About channel? More info at https://ffmpeg.org/contact.html#IRCChannels";>contact#IRCChannels


Remove the @ character and use "Libera Chat" instead of liberachat since 
this is not Twitter, and remove the "Unsure About channel?" part as it's 
both broken an unnecessary.
Maybe also include a line stating that the project no longer has a 
presence in Freenode to make it clear it's not an alternative IRC server.


LGTM with those changes.


+  
+
+
April 8th, 2021, FFmpeg 4.4 "Rao"

  FFmpeg 4.4 "Rao", a new



___
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".


Re: [FFmpeg-devel] [PATCH v2] avformat/hls Implement support for using AVSEEK_FLAG_BACKWARD when seeking

2021-06-18 Thread Gustav Grusell
On Sun, Jun 13, 2021 at 5:14 PM Lingjiang Fang 
wrote:

> On Sat, 12 Jun 2021 23:14:16 +0200
> Gustav Grusell  wrote:
>
> > On Sat, Jun 12, 2021 at 6:51 PM Lingjiang Fang
> >  wrote:
> >
> > > On Sat, 12 Jun 2021 14:16:22 +0200
> > > Gustav Grusell  wrote:
> > >
> > > > On Fri, Jun 11, 2021 at 6:29 PM Lingjiang Fang
> > > >  wrote:
> > > >
> > > > > On Sat,  5 Jun 2021 22:42:26 +0200
> > > > > Gustav Grusell  wrote:
> > > > >
> > > > > > Before, seeking in hls streams would always seek to the next
> > > > > > keyframe after the given timestamp. With this fix, if
> > > > > > AVSEEK_FLAG_BACKWARD is set, seeking will be to the first
> > > > > > keyframe of the segment containing the given timestamp. This
> > > > > > fixes #7485.
> > > > > >
> > > > > > Signed-off-by: Gustav Grusell 
> > > > > > ---
> > > > > >  libavformat/hls.c | 9 +
> > > > > >  1 file changed, 9 insertions(+)
> > > > > >
> > > > > > diff --git a/libavformat/hls.c b/libavformat/hls.c
> > > > > > index 8fc6924c90..fb8c9b071a 100644
> > > > > > --- a/libavformat/hls.c
> > > > > > +++ b/libavformat/hls.c
> > > > > > @@ -2197,6 +2197,15 @@ static int
> > > > > > hls_read_packet(AVFormatContext *s, AVPacket *pkt) break;
> > > > > >  }
> > > > > >
> > > > > > +/* If AVSEEK_FLAG_BACKWARD set and not
> > > > > > AVSEEK_FLAG_ANY,
> > > > > > + * we return the first keyframe
> > > > > > encountered */
> > > > > > +if (pls->seek_flags &
> > > > > > AVSEEK_FLAG_BACKWARD &&
> > > > > > +!(pls->seek_flags & AVSEEK_FLAG_ANY)
> > > > > > &&
> > > > > > +pls->pkt->flags & AV_PKT_FLAG_KEY) {
> > > > > >
> > > > > taking account of the case of using flag backward and flag any
> > > > > together, a logic like this is better:
> > > > >
> > > > > if ( pls->seek_flags & AVSEEK_FLAG_BACKWARD &&
> > > > > (pls->seek_flags & AVSEEK_FLAG_ANY ||
> > > > >  pls->pkt->flags & AV_PKT_FLAG_KEY)) {
> > > > >
> > > > > }
> > > > >
> > > > >
> > > > Thanks for your feedback!
> > > > I'm not sure about this, I think it makes more sense if seeking
> > > > with AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY behaves the same as
> > > > when using only AVSEEK_FLAG_ANY, that is to seek to as close as
> > > > possible as the exact timestamp, regardless if that is a keyframe
> > > > or not. If
> > > what do you mean "AVSEEK_FLAG_BACKWARD and AVSEEK_FLAGAV_ANY
> > > behaves the same as when using only AVSEEK_FLAG_ANY"?
> > > I think the default behavior of seek is seek to key frame, where
> > > AVSEEK_FLAGAV_ANY means we can accept seeking to non-key frame.
> > >
> > >
> > Sorry I think you can disregard what I wrote. I was thinking of the
> > case where the user would set both BACKWARDS and ANY flags, and
> > forgot that if the user sets the BACKWARDS flag, the ANY flag will be
> > added for other playlists than the one containing the stream
> > searched in. I think this made me miss your point.
> > So what I meant was that if seeking with both AVSEEK_FLAG_BACKWARD and
> > AVSEEK_FLAG_ANY, optimally, I would expect the result to
> > be to search to the nearest frame before or exactly at the seek
> > timestamp. Note that this is not how i behaves with my patch, it will
> > seek to the first frame with a timestamp equal to or greater to the
> > seek timestamp. In my opinion this is probably good enough, and is
> > in any case the same behaviour as before the patch.
> > So if the user has etAVSEEK_FLAG_ANY we would not then want to search
> > to the first frame of the segment, even if we have the
> > AVSEEK_FLAG_BACKWARD set. But of course this is different if
> > AVSEEK_FLAG_ANY has been set because this is not the seek playlist.
> >
> >
> > > > I'm not mistaken, with your proposed change, using both
> > > > AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY would always seek to the
> > > > first frame of the segment which is always a keyframe, so
> > > > behaviour would be the same as using only AVSEEK_FLAG_BACKWARD.
> > > when the first packet of a segment is not key-frame(rarely seen, but
> > > is possible), the behavior will be different.
> > > - AVSEEK_FLAG_BACKWARD will go on seeking until find a key frame
> > > - AVSEEK_FLAG_BACKWARD + AVSEEK_FLAG_BACKWARD should return
> > > immediatly
> > >
> > >
> > Ah yes you are correct. I was thinking that the HLS specification
> > requires an IDR frame at the start of every (video) segment, but now
> > that I looked it up that is not strictly the case.
> > Apples HLS authorign specification does require it though.
> >
> >
> > there is a similar logic at the end of this if{} block.
> > >
> > > >
> > > >
> > > > > > +pls->seek_timestamp = AV_NOPTS_VALUE;
> > > > > > +break;
> > > > > > +}
> > > > > > +
> > > > > >  tb = get_timebase(pls);
> > > > > >  ts_diff = av_rescale_rnd(pls->pkt->dts,
> > > > 

Re: [FFmpeg-devel] [PATCH v2] avfilter: compress CUDA PTX code if possible

2021-06-18 Thread Timo Rothenpieler

On 18.06.2021 22:45, Philip Langdale wrote:

On Sat, 12 Jun 2021 18:47:50 +0200
Timo Rothenpieler  wrote:


---
  .gitignore  |  1 +
  compat/cuda/ptx2c.sh| 34 
  configure   | 17 ++
  ffbuild/.gitignore  |  1 +
  ffbuild/bin2c.c | 76 ++
  ffbuild/common.mak  | 28 --
  libavfilter/Makefile| 14 +++--
  libavfilter/cuda/load_helper.c  | 96
+ libavfilter/cuda/load_helper.h  |
28 ++ libavfilter/vf_format_cuda.c|  7 ++-
  libavfilter/vf_overlay_cuda.c   |  8 +--
  libavfilter/vf_scale_cuda.c | 24 ++---
  libavfilter/vf_thumbnail_cuda.c |  7 ++-
  libavfilter/vf_yadif_cuda.c |  7 ++-
  14 files changed, 287 insertions(+), 61 deletions(-)
  delete mode 100755 compat/cuda/ptx2c.sh
  create mode 100644 ffbuild/bin2c.c
  create mode 100644 libavfilter/cuda/load_helper.c
  create mode 100644 libavfilter/cuda/load_helper.h


I just had comments about one file:
  

diff --git a/libavfilter/cuda/load_helper.c
b/libavfilter/cuda/load_helper.c new file mode 100644
index 00..62d644c29a
--- /dev/null
+++ b/libavfilter/cuda/load_helper.c
@@ -0,0 +1,96 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
+ */
+
+#include "config.h"
+
+#include "libavutil/hwcontext.h"
+#include "libavutil/hwcontext_cuda_internal.h"
+#include "libavutil/cuda_check.h"
+
+#if CONFIG_PTX_COMPRESSION
+#include 
+#define CHUNK_SIZE 1024 * 64
+#endif
+
+#include "load_helper.h"
+
+#define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, cu, x)
+
+int ff_cuda_load_module(void *avctx, AVCUDADeviceContext *hwctx,
CUmodule *cu_module,
+const unsigned char *data, const unsigned
int length) +{
+CudaFunctions *cu = hwctx->internal->cuda_dl;
+
+#if CONFIG_PTX_COMPRESSION
+z_stream stream = { 0 };
+uint8_t *buf, *tmp;
+uint64_t buf_size;
+int ret;
+
+if (inflateInit2(&stream, 32 + 15) != Z_OK) {


Can you add a comment explaining the magic numbers?


I have no idea what those numbers do, I copied them from http.c and they 
work.



+av_log(avctx, AV_LOG_ERROR, "Error during zlib
initialisation: %s\n", stream.msg);
+return AVERROR(ENOSYS);
+}
+
+buf_size = CHUNK_SIZE * 4;
+buf = av_realloc(NULL, buf_size);
+if (!buf) {
+inflateEnd(&stream);
+return AVERROR(ENOMEM);
+}
+
+stream.next_in = data;
+stream.avail_in = length;
+
+do {
+stream.avail_out = buf_size - stream.total_out;
+stream.next_out = buf + stream.total_out;
+
+ret = inflate(&stream, Z_FINISH);
+if (ret != Z_OK && ret != Z_STREAM_END) {
+av_log(avctx, AV_LOG_ERROR, "zlib inflate error: %s\n",
stream.msg);
+inflateEnd(&stream);
+av_free(buf);
+return AVERROR(EINVAL);
+}
+
+if (stream.avail_out == 0) {
+buf_size += CHUNK_SIZE;
+tmp = av_realloc(buf, buf_size);
+if (!tmp) {
+inflateEnd(&stream);
+av_free(buf);
+return AVERROR(ENOMEM);
+}
+buf = tmp;
+}
+} while (ret != Z_STREAM_END);
+
+// NULL-terminate string
+// there is guaranteed to be space for this, due to condition in
loop


This is because it will still grow the buffer if avail_out is zero at
the time you hit Z_STREAM_END?


If avail_out was 0, the condition right above it would have grown it, so 
it has at least one byte free.




smime.p7s
Description: S/MIME Cryptographic Signature
___
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".


Re: [FFmpeg-devel] [PATCH v2 10/33] fftools: provide media type info for devices

2021-06-18 Thread Diederick C. Niehorster
On Thu, Jun 17, 2021 at 3:41 AM Andreas Rheinhardt
 wrote:
>
> Diederick Niehorster:
> > fftools now print info about what media type(s), if any, are provided by
> > sink and source avdevices.
> >
> > Signed-off-by: Diederick Niehorster 
> > ---
> >  fftools/cmdutils.c | 34 --
> >  1 file changed, 24 insertions(+), 10 deletions(-)
> >
> > diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
> > index 4148285971..e7bd9f2644 100644
> > --- a/fftools/cmdutils.c
> > +++ b/fftools/cmdutils.c
> > @@ -2205,9 +2205,29 @@ double get_rotation(AVStream *st)
> >  }
> >
> >  #if CONFIG_AVDEVICE
> > +static void print_device_list(AVDeviceInfoList *device_list)
> > +{
> > +// print devices
> > +for (int i = 0; i < device_list->nb_devices; i++) {
> > +printf("%s %s [%s]", device_list->default_device == i ? "*" : " ",
> > +device_list->devices[i]->device_name, 
> > device_list->devices[i]->device_description);
> > +if (device_list->devices[i]->nb_media_types > 0 && 
> > device_list->devices[i]->media_types) {
> > +const char* media_type = 
> > av_get_media_type_string(device_list->devices[i]->media_types[0]);
> > +printf(" (%s", media_type ? media_type : "unknown");
> > +for (int i = 1; i < device_list->devices[i]->nb_media_types; 
> > ++i) {
>
> You are shadowing the external counter variable here and are using a
> different device for every iteration. Has this code actually been tested?

Fixed both from your first mail. Yes, i have tested this, but only
with zero or one media type per device since thats all i had. I could
of course jury-rig the code to output that a device has two media
types and then this didn't work (and it brought to the surface a bug
in an earlier commit too). Thanks!

Cheers,
Dee
___
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] [PATCH 2/3] avcodec/decode: add an internal codec flag to signal a decoder sets all output frame properties

2021-06-18 Thread James Almer
Decoders like cuviddec ignore and overwrite all the properties set by the 
generic
code as derived from AVCodecInternal.last_pkt_props. This flag ensures 
libavcodec
will not store and potentially queue input packets that ultimately will not be 
used.

Signed-off-by: James Almer 
---
 libavcodec/decode.c   | 21 ++---
 libavcodec/internal.h |  5 +
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 44f0b11546..68acf0cf8f 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -233,9 +233,11 @@ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket 
*pkt)
 if (ret < 0)
 return ret;
 
-ret = extract_packet_props(avctx->internal, pkt);
-if (ret < 0)
-goto finish;
+if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
+ret = extract_packet_props(avctx->internal, pkt);
+if (ret < 0)
+goto finish;
+}
 
 ret = apply_param_change(avctx, pkt);
 if (ret < 0)
@@ -487,11 +489,13 @@ static inline int decode_simple_internal(AVCodecContext 
*avctx, AVFrame *frame,
 
 pkt->data+= consumed;
 pkt->size-= consumed;
-avci->last_pkt_props->size -= consumed; // See extract_packet_props() 
comment.
 pkt->pts  = AV_NOPTS_VALUE;
 pkt->dts  = AV_NOPTS_VALUE;
-avci->last_pkt_props->pts = AV_NOPTS_VALUE;
-avci->last_pkt_props->dts = AV_NOPTS_VALUE;
+if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
+avci->last_pkt_props->size -= consumed; // See 
extract_packet_props() comment.
+avci->last_pkt_props->pts = AV_NOPTS_VALUE;
+avci->last_pkt_props->dts = AV_NOPTS_VALUE;
+}
 }
 
 if (got_frame)
@@ -533,7 +537,8 @@ static int decode_receive_frame_internal(AVCodecContext 
*avctx, AVFrame *frame)
 if (ret == AVERROR_EOF)
 avci->draining_done = 1;
 
-if (IS_EMPTY(avci->last_pkt_props) && av_fifo_size(avci->pkt_props) >= 
sizeof(*avci->last_pkt_props))
+if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS) &&
+IS_EMPTY(avci->last_pkt_props) && av_fifo_size(avci->pkt_props) >= 
sizeof(*avci->last_pkt_props))
 av_fifo_generic_read(avci->pkt_props,
  avci->last_pkt_props, 
sizeof(*avci->last_pkt_props), NULL);
 
@@ -1494,6 +1499,7 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame 
*frame)
 { AV_PKT_DATA_S12M_TIMECODE,  AV_FRAME_DATA_S12M_TIMECODE 
},
 };
 
+if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) {
 frame->pts = pkt->pts;
 frame->pkt_pos  = pkt->pos;
 frame->pkt_duration = pkt->duration;
@@ -1519,6 +1525,7 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame 
*frame)
 } else {
 frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD);
 }
+}
 frame->reordered_opaque = avctx->reordered_opaque;
 
 if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED)
diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index 975ec0ba30..586819cd1b 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -78,6 +78,11 @@
  * Codec handles avctx->thread_count == 0 (auto) internally.
  */
 #define FF_CODEC_CAP_AUTO_THREADS   (1 << 7)
+/**
+ * Codec handles output frame properties internally instead of letting the
+ * internal logic derive them from AVCodecInternal.last_pkt_props.
+ */
+#define FF_CODEC_CAP_SETS_FRAME_PROPS   (1 << 8)
 
 /**
  * AVCodec.codec_tags termination value
-- 
2.32.0

___
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] [PATCH 1/3] avcodec/decode: fetch packets from the pkt_props FIFO on every frame returned

2021-06-18 Thread James Almer
Fixes memleaks on decoders that don't call ff_decode_frame_props().

Signed-off-by: James Almer 
---
 libavcodec/decode.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 75bc7ad98e..44f0b11546 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -533,6 +533,10 @@ static int decode_receive_frame_internal(AVCodecContext 
*avctx, AVFrame *frame)
 if (ret == AVERROR_EOF)
 avci->draining_done = 1;
 
+if (IS_EMPTY(avci->last_pkt_props) && av_fifo_size(avci->pkt_props) >= 
sizeof(*avci->last_pkt_props))
+av_fifo_generic_read(avci->pkt_props,
+ avci->last_pkt_props, 
sizeof(*avci->last_pkt_props), NULL);
+
 if (!ret) {
 frame->best_effort_timestamp = guess_correct_pts(avctx,
  frame->pts,
@@ -1490,10 +1494,6 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame 
*frame)
 { AV_PKT_DATA_S12M_TIMECODE,  AV_FRAME_DATA_S12M_TIMECODE 
},
 };
 
-if (IS_EMPTY(pkt) && av_fifo_size(avctx->internal->pkt_props) >= 
sizeof(*pkt))
-av_fifo_generic_read(avctx->internal->pkt_props,
- pkt, sizeof(*pkt), NULL);
-
 frame->pts = pkt->pts;
 frame->pkt_pos  = pkt->pos;
 frame->pkt_duration = pkt->duration;
-- 
2.32.0

___
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] [PATCH 3/3] avcodec/cuviddec: signal that the decoder sets all output frame properties

2021-06-18 Thread James Almer
Fixes memleaks described in ticket #9082.

Signed-off-by: James Almer 
---
 libavcodec/cuviddec.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c
index d8c7f23a37..e15c51 100644
--- a/libavcodec/cuviddec.c
+++ b/libavcodec/cuviddec.c
@@ -1116,6 +1116,7 @@ static const AVCodecHWConfigInternal *const 
cuvid_hw_configs[] = {
 .flush  = cuvid_flush, \
 .bsfs   = bsf_name, \
 .capabilities   = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING | 
AV_CODEC_CAP_HARDWARE, \
+.caps_internal  = FF_CODEC_CAP_SETS_FRAME_PROPS, \
 .pix_fmts   = (const enum AVPixelFormat[]){ AV_PIX_FMT_CUDA, \
 AV_PIX_FMT_NV12, \
 AV_PIX_FMT_P010, \
-- 
2.32.0

___
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".


Re: [FFmpeg-devel] [PATCH v2] avfilter: compress CUDA PTX code if possible

2021-06-18 Thread Philip Langdale
On Sat, 12 Jun 2021 18:47:50 +0200
Timo Rothenpieler  wrote:

> ---
>  .gitignore  |  1 +
>  compat/cuda/ptx2c.sh| 34 
>  configure   | 17 ++
>  ffbuild/.gitignore  |  1 +
>  ffbuild/bin2c.c | 76 ++
>  ffbuild/common.mak  | 28 --
>  libavfilter/Makefile| 14 +++--
>  libavfilter/cuda/load_helper.c  | 96
> + libavfilter/cuda/load_helper.h  |
> 28 ++ libavfilter/vf_format_cuda.c|  7 ++-
>  libavfilter/vf_overlay_cuda.c   |  8 +--
>  libavfilter/vf_scale_cuda.c | 24 ++---
>  libavfilter/vf_thumbnail_cuda.c |  7 ++-
>  libavfilter/vf_yadif_cuda.c |  7 ++-
>  14 files changed, 287 insertions(+), 61 deletions(-)
>  delete mode 100755 compat/cuda/ptx2c.sh
>  create mode 100644 ffbuild/bin2c.c
>  create mode 100644 libavfilter/cuda/load_helper.c
>  create mode 100644 libavfilter/cuda/load_helper.h

I just had comments about one file: 
 
> diff --git a/libavfilter/cuda/load_helper.c
> b/libavfilter/cuda/load_helper.c new file mode 100644
> index 00..62d644c29a
> --- /dev/null
> +++ b/libavfilter/cuda/load_helper.c
> @@ -0,0 +1,96 @@
> +/*
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301 USA
> + */
> +
> +#include "config.h"
> +
> +#include "libavutil/hwcontext.h"
> +#include "libavutil/hwcontext_cuda_internal.h"
> +#include "libavutil/cuda_check.h"
> +
> +#if CONFIG_PTX_COMPRESSION
> +#include 
> +#define CHUNK_SIZE 1024 * 64
> +#endif
> +
> +#include "load_helper.h"
> +
> +#define CHECK_CU(x) FF_CUDA_CHECK_DL(avctx, cu, x)
> +
> +int ff_cuda_load_module(void *avctx, AVCUDADeviceContext *hwctx,
> CUmodule *cu_module,
> +const unsigned char *data, const unsigned
> int length) +{
> +CudaFunctions *cu = hwctx->internal->cuda_dl;
> +
> +#if CONFIG_PTX_COMPRESSION
> +z_stream stream = { 0 };
> +uint8_t *buf, *tmp;
> +uint64_t buf_size;
> +int ret;
> +
> +if (inflateInit2(&stream, 32 + 15) != Z_OK) {

Can you add a comment explaining the magic numbers?

> +av_log(avctx, AV_LOG_ERROR, "Error during zlib
> initialisation: %s\n", stream.msg);
> +return AVERROR(ENOSYS);
> +}
> +
> +buf_size = CHUNK_SIZE * 4;
> +buf = av_realloc(NULL, buf_size);
> +if (!buf) {
> +inflateEnd(&stream);
> +return AVERROR(ENOMEM);
> +}
> +
> +stream.next_in = data;
> +stream.avail_in = length;
> +
> +do {
> +stream.avail_out = buf_size - stream.total_out;
> +stream.next_out = buf + stream.total_out;
> +
> +ret = inflate(&stream, Z_FINISH);
> +if (ret != Z_OK && ret != Z_STREAM_END) {
> +av_log(avctx, AV_LOG_ERROR, "zlib inflate error: %s\n",
> stream.msg);
> +inflateEnd(&stream);
> +av_free(buf);
> +return AVERROR(EINVAL);
> +}
> +
> +if (stream.avail_out == 0) {
> +buf_size += CHUNK_SIZE;
> +tmp = av_realloc(buf, buf_size);
> +if (!tmp) {
> +inflateEnd(&stream);
> +av_free(buf);
> +return AVERROR(ENOMEM);
> +}
> +buf = tmp;
> +}
> +} while (ret != Z_STREAM_END);
> +
> +// NULL-terminate string
> +// there is guaranteed to be space for this, due to condition in
> loop

This is because it will still grow the buffer if avail_out is zero at
the time you hit Z_STREAM_END?

> +buf[stream.total_out] = 0;
> +
> +inflateEnd(&stream);
> +
> +ret = CHECK_CU(cu->cuModuleLoadData(cu_module, buf));
> +av_free(buf);
> +return ret;
> +#else
> +return CHECK_CU(cu->cuModuleLoadData(cu_module, data));
> +#endif
> +}

Otherwise, LGTM.

Thanks,

--phil
___
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".


Re: [FFmpeg-devel] [PATCH] avfilter: add format_cuda filter

2021-06-18 Thread Philip Langdale
On Fri, 11 Jun 2021 16:43:07 +0200
Timo Rothenpieler  wrote:

> ---
>  configure   |   2 +
>  doc/filters.texi|  46 ++
>  libavfilter/Makefile|   1 +
>  libavfilter/allfilters.c|   1 +
>  libavfilter/cuda/vector_helpers.cuh |  14 +-
>  libavfilter/version.h   |   2 +-
>  libavfilter/vf_format_cuda.c| 433 ++
>  libavfilter/vf_format_cuda.cu   | 849
>  8 files changed, 1345 insertions(+), 3
> deletions(-) create mode 100644 libavfilter/vf_format_cuda.c
>  create mode 100644 libavfilter/vf_format_cuda.cu

LGTM. I agree it's better to get it in and then iterate on adding on
additional formats.

--phil
___
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".


Re: [FFmpeg-devel] [PATCH v2] avcodec/ccaption_dec: Make real-time latency configurable

2021-06-18 Thread Pavel Koshevoy
On Thu, Jun 17, 2021 at 7:07 PM Pavel Koshevoy  wrote:

>
>
> On Sun, Jun 13, 2021 at 3:49 PM Pavel Koshevoy 
> wrote:
>
>>
>>
>> On Sat, Jun 5, 2021 at 11:40 AM Pavel Koshevoy 
>> wrote:
>>
>>> Un-hardcode the 200ms minimum latency between emitting subtitle events
>>> so that those that wish to receive a subtitle event for every screen
>>> change could do so.
>>>
>>> The problem with delaying realtime output by any amount is that it is
>>> unknown when the next byte pair that would trigger output will happen.
>>> It may be within 200ms, or it may be several seconds later -- that's
>>> not realtime at all.
>>> ---
>>>  libavcodec/ccaption_dec.c | 4 +++-
>>>  libavcodec/version.h  | 2 +-
>>>  2 files changed, 4 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/libavcodec/ccaption_dec.c b/libavcodec/ccaption_dec.c
>>> index de05d037a8..27c61527f6 100644
>>> --- a/libavcodec/ccaption_dec.c
>>> +++ b/libavcodec/ccaption_dec.c
>>> @@ -238,6 +238,7 @@ struct Screen {
>>>  typedef struct CCaptionSubContext {
>>>  AVClass *class;
>>>  int real_time;
>>> +int real_time_latency_msec;
>>>  int data_field;
>>>  struct Screen screen[2];
>>>  int active_screen;
>>> @@ -906,7 +907,7 @@ static int decode(AVCodecContext *avctx, void *data,
>>> int *got_sub, AVPacket *avp
>>>  }
>>>
>>>  if (ctx->real_time && ctx->screen_touched &&
>>> -sub->pts > ctx->last_real_time + av_rescale_q(200, ms_tb,
>>> AV_TIME_BASE_Q)) {
>>> +sub->pts >= ctx->last_real_time +
>>> av_rescale_q(ctx->real_time_latency_msec, ms_tb, AV_TIME_BASE_Q)) {
>>>  ctx->last_real_time = sub->pts;
>>>  ctx->screen_touched = 0;
>>>
>>> @@ -927,6 +928,7 @@ static int decode(AVCodecContext *avctx, void *data,
>>> int *got_sub, AVPacket *avp
>>>  #define SD AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_DECODING_PARAM
>>>  static const AVOption options[] = {
>>>  { "real_time", "emit subtitle events as they are decoded for
>>> real-time display", OFFSET(real_time), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0,
>>> 1, SD },
>>> +{ "real_time_latency_msec", "minimum elapsed time between emitting
>>> real-time subtitle events", OFFSET(real_time_latency_msec),
>>> AV_OPT_TYPE_INT, { .i64 = 200 }, 0, 500, SD },
>>>  { "data_field", "select data field", OFFSET(data_field),
>>> AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, SD, "data_field" },
>>>  { "auto",   "pick first one that appears", 0, AV_OPT_TYPE_CONST, {
>>> .i64 =-1 }, 0, 0, SD, "data_field" },
>>>  { "first",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, SD,
>>> "data_field" },
>>> diff --git a/libavcodec/version.h b/libavcodec/version.h
>>> index 48165b9ac4..5b1e9e77f3 100644
>>> --- a/libavcodec/version.h
>>> +++ b/libavcodec/version.h
>>> @@ -29,7 +29,7 @@
>>>
>>>  #define LIBAVCODEC_VERSION_MAJOR  59
>>>  #define LIBAVCODEC_VERSION_MINOR   1
>>> -#define LIBAVCODEC_VERSION_MICRO 100
>>> +#define LIBAVCODEC_VERSION_MICRO 101
>>>
>>>  #define LIBAVCODEC_VERSION_INT
>>> AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
>>>
>>> LIBAVCODEC_VERSION_MINOR, \
>>> --
>>> 2.26.2
>>>
>>>
>>
>> Ping.  If there are no objections may this be applied?
>>
>> Thank you,
>> Pavel.
>>
>
>
> If there are no objections I will apply and push this in 24h
>
> Thank you,
> Pavel.
>


Bumped LIBAVCODEC_VERSION_MICRO to 102 and pushed.

Thank you,
Pavel.
___
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".