Re: [FFmpeg-devel] [PATCH v2 3/3] libavcodec/qsvdec: using suggested num to set init_pool_size

2022-03-27 Thread Xiang, Haihao
On Fri, 2022-03-18 at 07:40 +, Soft Works wrote:
> > -Original Message-
> > From: ffmpeg-devel  On Behalf Of
> > Wenbin Chen
> > Sent: Friday, March 18, 2022 7:25 AM
> > To: ffmpeg-devel@ffmpeg.org
> > Subject: [FFmpeg-devel] [PATCH v2 3/3] libavcodec/qsvdec: using
> > suggested num to set init_pool_size
> > 
> > The init_pool_size is set to be 64 and it is too many.
> > Use IOSurfQuery to get NumFrameSuggest which is the suggested
> > number of frame that needed to be allocated when initializing the
> > decoder.
> > Considering that the hevc_qsv encoder uses the  most frame buffer,
> > async is 4 (default) and max_b_frames is 8 (default) and decoder
> > may followed by VPP, use NumFrameSuggest + 16 to set init_pool_size.
> > 
> > Signed-off-by: Wenbin Chen 
> > Signed-off-by: Guangxin Xu 
> > ---
> >  libavcodec/qsvdec.c | 14 --
> >  1 file changed, 12 insertions(+), 2 deletions(-)
> > 
> > diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
> > index 210bd0c1d5..9875d3d632 100644
> > --- a/libavcodec/qsvdec.c
> > +++ b/libavcodec/qsvdec.c
> > @@ -88,7 +88,7 @@ typedef struct QSVContext {
> >  uint32_t fourcc;
> >  mfxFrameInfo frame_info;
> >  AVBufferPool *pool;
> > -
> > +int suggest_pool_size;
> >  int initialized;
> > 
> >  // options set by the caller
> > @@ -275,7 +275,7 @@ static int qsv_decode_preinit(AVCodecContext
> > *avctx, QSVContext *q, enum AVPixel
> >  hwframes_ctx->height= FFALIGN(avctx-
> > > coded_height, 32);
> > 
> >  hwframes_ctx->format= AV_PIX_FMT_QSV;
> >  hwframes_ctx->sw_format = avctx->sw_pix_fmt;
> > -hwframes_ctx->initial_pool_size = 64 + avctx-
> > > extra_hw_frames;
> > 
> > +hwframes_ctx->initial_pool_size = q->suggest_pool_size + 16 +
> > avctx->extra_hw_frames;
> >  frames_hwctx->frame_type=
> > MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET;
> > 
> >  ret = av_hwframe_ctx_init(avctx->hw_frames_ctx);
> > @@ -793,6 +793,9 @@ static int qsv_process_data(AVCodecContext *avctx,
> > QSVContext *q,
> >  }
> > 
> >  if (q->reinit_flag || !q->session || !q->initialized) {
> > +mfxFrameAllocRequest request;
> > +memset(&request, 0, sizeof(request));
> > +
> >  q->reinit_flag = 0;
> >  ret = qsv_decode_header(avctx, q, pkt, pix_fmt, ¶m);
> >  if (ret < 0) {
> > @@ -802,12 +805,19 @@ static int qsv_process_data(AVCodecContext
> > *avctx, QSVContext *q,
> >  av_log(avctx, AV_LOG_ERROR, "Error decoding
> > header\n");
> >  goto reinit_fail;
> >  }
> > +param.IOPattern = q->iopattern;
> > 
> >  q->orig_pix_fmt = avctx->pix_fmt = pix_fmt =
> > ff_qsv_map_fourcc(param.mfx.FrameInfo.FourCC);
> > 
> >  avctx->coded_width  = param.mfx.FrameInfo.Width;
> >  avctx->coded_height = param.mfx.FrameInfo.Height;
> > 
> > +ret = MFXVideoDECODE_QueryIOSurf(q->session, ¶m,
> > &request);
> > +if (ret < 0)
> > +return ff_qsv_print_error(avctx, ret, "Error querying IO
> > surface");
> > +
> > +q->suggest_pool_size = request.NumFrameSuggested;
> > +
> >  ret = qsv_decode_preinit(avctx, q, pix_fmt, ¶m);
> >  if (ret < 0)
> >  goto reinit_fail;
> > --
> 
> Thanks for the patch! I have that on my list for quite a while.
> Will look at it shortly.

Hi Softworz,

This patchset LGTM and works well, do you have any comment ? 

Thanks
Haihao

___
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/4] avutil: add ambient viewing environment metadata side data

2022-03-27 Thread lance . lmwang
On Sun, Mar 27, 2022 at 08:30:30PM -0300, James Almer wrote:
> 
> 
> On 3/27/2022 8:25 PM, lance.lmw...@gmail.com wrote:
> > From: Limin Wang 
> > 
> > Signed-off-by: Limin Wang 
> > ---
> >   libavutil/Makefile   |  2 +
> >   libavutil/ambient_viewing_env_metadata.c | 47 +
> >   libavutil/ambient_viewing_env_metadata.h | 72 
> > 
> >   libavutil/frame.c|  1 +
> >   libavutil/frame.h|  6 +++
> >   5 files changed, 128 insertions(+)
> >   create mode 100644 libavutil/ambient_viewing_env_metadata.c
> >   create mode 100644 libavutil/ambient_viewing_env_metadata.h
> > 
> > diff --git a/libavutil/Makefile b/libavutil/Makefile
> > index 81df3b0..e388d33 100644
> > --- a/libavutil/Makefile
> > +++ b/libavutil/Makefile
> > @@ -26,6 +26,7 @@ HEADERS = adler32.h   
> >   \
> > display.h \
> > dovi_meta.h   \
> > downmix_info.h\
> > +  ambient_viewing_env_metadata.h\
> > encryption_info.h \
> > error.h   \
> > eval.h\
> > @@ -119,6 +120,7 @@ OBJS = adler32.o
> > \
> >  display.o\
> >  dovi_meta.o  \
> >  downmix_info.o   \
> > +   ambient_viewing_env_metadata.o   \
> >  encryption_info.o\
> >  error.o  \
> >  eval.o   \
> > diff --git a/libavutil/ambient_viewing_env_metadata.c 
> > b/libavutil/ambient_viewing_env_metadata.c
> > new file mode 100644
> > index 000..7006b64
> > --- /dev/null
> > +++ b/libavutil/ambient_viewing_env_metadata.c
> > @@ -0,0 +1,47 @@
> > +/**
> > + * Copyright (c) 2022 Limin Wang 
> > + *
> > + * 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 
> > +#include 
> > +#include "ambient_viewing_env_metadata.h"
> > +#include "mem.h"
> > +
> > +AVAmbientViewingEnvMetadata *av_ambient_viewing_env_metadata_alloc(size_t 
> > *size)
> > +{
> > +AVAmbientViewingEnvMetadata *metadata = av_mallocz(sizeof(*metadata));
> > +
> > +if (size)
> > +*size = sizeof(*metadata);
> > +
> > +return metadata;
> > +}
> > +
> > +AVAmbientViewingEnvMetadata 
> > *av_ambient_viewing_env_metadata_create_side_data(AVFrame *frame)
> > +{
> > +AVFrameSideData *side_data = av_frame_new_side_data(frame,
> > +AV_FRAME_DATA_AMBIENT_VIEWING_ENV,
> > +sizeof(AVAmbientViewingEnvMetadata));
> > +if (!side_data)
> > +return NULL;
> > +
> > +memset(side_data->data, 0, sizeof(AVAmbientViewingEnvMetadata));
> > +
> > +return (AVAmbientViewingEnvMetadata *)side_data->data;
> > +}
> > diff --git a/libavutil/ambient_viewing_env_metadata.h 
> > b/libavutil/ambient_viewing_env_metadata.h
> > new file mode 100644
> > index 000..b0fbcd0
> > --- /dev/null
> > +++ b/libavutil/ambient_viewing_env_metadata.h
> > @@ -0,0 +1,72 @@
> > +/*
> > + * Copyright (c) 2022 Limin Wang 
> > + *
> > + * 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 o

[FFmpeg-devel] [PATCH 2/2] avcodec/cbs_av1: also copy the last frame header's decomposed content when parsing redundant frame headers

2022-03-27 Thread James Almer
This prevents CBS from propagating zeroed AV1RawFrameHeader units in reading
scenarios.
Writing scenarios remain unaffected as the content of these units is not used
to assemble the bitstream.

Signed-off-by: James Almer 
---
 libavcodec/cbs_av1.c | 11 +++
 libavcodec/cbs_av1.h |  2 ++
 libavcodec/cbs_av1_syntax_template.c |  6 ++
 3 files changed, 19 insertions(+)

diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
index ecd775ea2a..6cb832210c 100644
--- a/libavcodec/cbs_av1.c
+++ b/libavcodec/cbs_av1.c
@@ -969,6 +969,15 @@ static int cbs_av1_read_unit(CodedBitstreamContext *ctx,
 unit->data_ref);
 if (err < 0)
 return err;
+
+if (priv->frame_header)
+break;
+
+av_buffer_unref(&priv->frame_header_ref);
+priv->frame_header_ref = av_buffer_ref(unit->content_ref);
+if (!priv->frame_header_ref)
+return AVERROR(ENOMEM);
+priv->frame_header = &obu->obu.frame_header;
 }
 break;
 case AV1_OBU_TILE_GROUP:
@@ -1251,6 +1260,7 @@ static void cbs_av1_flush(CodedBitstreamContext *ctx)
 
 av_buffer_unref(&priv->frame_header_data_ref);
 priv->sequence_header = NULL;
+priv->frame_header = NULL;
 priv->frame_header_data = NULL;
 
 memset(priv->ref, 0, sizeof(priv->ref));
@@ -1264,6 +1274,7 @@ static void cbs_av1_close(CodedBitstreamContext *ctx)
 CodedBitstreamAV1Context *priv = ctx->priv_data;
 
 av_buffer_unref(&priv->sequence_header_ref);
+av_buffer_unref(&priv->frame_header_ref);
 av_buffer_unref(&priv->frame_header_data_ref);
 }
 
diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h
index d4776b7a30..138b273470 100644
--- a/libavcodec/cbs_av1.h
+++ b/libavcodec/cbs_av1.h
@@ -431,6 +431,8 @@ typedef struct CodedBitstreamAV1Context {
 AVBufferRef  *sequence_header_ref;
 
 int seen_frame_header;
+AVBufferRef *frame_header_ref;
+AV1RawFrameHeader *frame_header;
 AVBufferRef *frame_header_data_ref;
 uint8_t *frame_header_data;
 size_t   frame_header_data_size;
diff --git a/libavcodec/cbs_av1_syntax_template.c 
b/libavcodec/cbs_av1_syntax_template.c
index bd50cfbe38..aadfa34b3c 100644
--- a/libavcodec/cbs_av1_syntax_template.c
+++ b/libavcodec/cbs_av1_syntax_template.c
@@ -1708,6 +1708,11 @@ static int FUNC(frame_header_obu)(CodedBitstreamContext 
*ctx, RWContext *rw,
 xf(b, frame_header_copy[i],
val, val, val, 1, i / 8);
 }
+
+#ifdef READ
+av_assert0(priv->frame_header_ref && priv->frame_header);
+memcpy(current, priv->frame_header, sizeof(*current));
+#endif
 }
 } else {
 if (redundant)
@@ -1730,6 +1735,7 @@ static int FUNC(frame_header_obu)(CodedBitstreamContext 
*ctx, RWContext *rw,
 } else {
 priv->seen_frame_header = 1;
 
+priv->frame_header = NULL;
 av_buffer_unref(&priv->frame_header_data_ref);
 
 #ifdef READ
-- 
2.35.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] [PATCH 1/2] avcodec/cbs_av1: rename the private frame_header fields to frame_header_data

2022-03-27 Thread James Almer
It doesn't contain the decomposed struct, but the raw bitstream.
This is in preparation for the following patch.

Signed-off-by: James Almer 
---
 libavcodec/cbs_av1.c |  6 +++---
 libavcodec/cbs_av1.h |  6 +++---
 libavcodec/cbs_av1_syntax_template.c | 28 ++--
 3 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/libavcodec/cbs_av1.c b/libavcodec/cbs_av1.c
index 1229480567..ecd775ea2a 100644
--- a/libavcodec/cbs_av1.c
+++ b/libavcodec/cbs_av1.c
@@ -1249,9 +1249,9 @@ static void cbs_av1_flush(CodedBitstreamContext *ctx)
 {
 CodedBitstreamAV1Context *priv = ctx->priv_data;
 
-av_buffer_unref(&priv->frame_header_ref);
+av_buffer_unref(&priv->frame_header_data_ref);
 priv->sequence_header = NULL;
-priv->frame_header = NULL;
+priv->frame_header_data = NULL;
 
 memset(priv->ref, 0, sizeof(priv->ref));
 priv->operating_point_idc = 0;
@@ -1264,7 +1264,7 @@ static void cbs_av1_close(CodedBitstreamContext *ctx)
 CodedBitstreamAV1Context *priv = ctx->priv_data;
 
 av_buffer_unref(&priv->sequence_header_ref);
-av_buffer_unref(&priv->frame_header_ref);
+av_buffer_unref(&priv->frame_header_data_ref);
 }
 
 static void cbs_av1_free_metadata(void *unit, uint8_t *content)
diff --git a/libavcodec/cbs_av1.h b/libavcodec/cbs_av1.h
index 1fc80dcfa0..d4776b7a30 100644
--- a/libavcodec/cbs_av1.h
+++ b/libavcodec/cbs_av1.h
@@ -431,9 +431,9 @@ typedef struct CodedBitstreamAV1Context {
 AVBufferRef  *sequence_header_ref;
 
 int seen_frame_header;
-AVBufferRef *frame_header_ref;
-uint8_t *frame_header;
-size_t   frame_header_size;
+AVBufferRef *frame_header_data_ref;
+uint8_t *frame_header_data;
+size_t   frame_header_data_size;
 
 int temporal_id;
 int spatial_id;
diff --git a/libavcodec/cbs_av1_syntax_template.c 
b/libavcodec/cbs_av1_syntax_template.c
index d98d3d42de..bd50cfbe38 100644
--- a/libavcodec/cbs_av1_syntax_template.c
+++ b/libavcodec/cbs_av1_syntax_template.c
@@ -1698,12 +1698,12 @@ static int FUNC(frame_header_obu)(CodedBitstreamContext 
*ctx, RWContext *rw,
 
 HEADER("Redundant Frame Header");
 
-av_assert0(priv->frame_header_ref && priv->frame_header);
+av_assert0(priv->frame_header_data_ref && priv->frame_header_data);
 
-init_get_bits(&fh, priv->frame_header,
-  priv->frame_header_size);
-for (i = 0; i < priv->frame_header_size; i += 8) {
-b = FFMIN(priv->frame_header_size - i, 8);
+init_get_bits(&fh, priv->frame_header_data,
+  priv->frame_header_data_size);
+for (i = 0; i < priv->frame_header_data_size; i += 8) {
+b = FFMIN(priv->frame_header_data_size - i, 8);
 val = get_bits(&fh, b);
 xf(b, frame_header_copy[i],
val, val, val, 1, i / 8);
@@ -1730,7 +1730,7 @@ static int FUNC(frame_header_obu)(CodedBitstreamContext 
*ctx, RWContext *rw,
 } else {
 priv->seen_frame_header = 1;
 
-av_buffer_unref(&priv->frame_header_ref);
+av_buffer_unref(&priv->frame_header_data_ref);
 
 #ifdef READ
 fh_bits  = get_bits_count(rw) - start_pos;
@@ -1748,20 +1748,20 @@ static int FUNC(frame_header_obu)(CodedBitstreamContext 
*ctx, RWContext *rw,
 #endif
 fh_bytes = (fh_bits + 7) / 8;
 
-priv->frame_header_size = fh_bits;
+priv->frame_header_data_size = fh_bits;
 
 if (rw_buffer_ref) {
-priv->frame_header_ref = av_buffer_ref(rw_buffer_ref);
-if (!priv->frame_header_ref)
+priv->frame_header_data_ref = av_buffer_ref(rw_buffer_ref);
+if (!priv->frame_header_data_ref)
 return AVERROR(ENOMEM);
-priv->frame_header = fh_start;
+priv->frame_header_data = fh_start;
 } else {
-priv->frame_header_ref =
+priv->frame_header_data_ref =
 av_buffer_alloc(fh_bytes + AV_INPUT_BUFFER_PADDING_SIZE);
-if (!priv->frame_header_ref)
+if (!priv->frame_header_data_ref)
 return AVERROR(ENOMEM);
-priv->frame_header = priv->frame_header_ref->data;
-memcpy(priv->frame_header, fh_start, fh_bytes);
+priv->frame_header_data = priv->frame_header_data_ref->data;
+memcpy(priv->frame_header_data, fh_start, fh_bytes);
 }
 }
 }
-- 
2.35.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 v9 1/1] avformat: Add IPFS protocol support.

2022-03-27 Thread Mark Gaiser
On Wed, Mar 23, 2022 at 12:24 PM Mark Gaiser  wrote:

> On Fri, Mar 18, 2022 at 3:59 PM Mark Gaiser  wrote:
>
>> On Fri, Mar 18, 2022 at 3:50 PM Mark Gaiser  wrote:
>>
>>> This patch adds support for:
>>> - ffplay ipfs://
>>> - ffplay ipns://
>>>
>>> IPFS data can be played from so called "ipfs gateways".
>>> A gateway is essentially a webserver that gives access to the
>>> distributed IPFS network.
>>>
>>> This protocol support (ipfs and ipns) therefore translates
>>> ipfs:// and ipns:// to a http:// url. This resulting url is
>>> then handled by the http protocol. It could also be https
>>> depending on the gateway provided.
>>>
>>> To use this protocol, a gateway must be provided.
>>> If you do nothing it will try to find it in your
>>> $HOME/.ipfs/gateway file. The ways to set it manually are:
>>> 1. Define a -gateway  to the gateway.
>>> 2. Define $IPFS_GATEWAY with the full http link to the gateway.
>>> 3. Define $IPFS_PATH and point it to the IPFS data path.
>>> 4. Have IPFS running in your local user folder (under $HOME/.ipfs).
>>>
>>> Signed-off-by: Mark Gaiser 
>>> ---
>>>  configure |   2 +
>>>  doc/protocols.texi|  30 
>>>  libavformat/Makefile  |   2 +
>>>  libavformat/ipfsgateway.c | 310 ++
>>>  libavformat/protocols.c   |   2 +
>>>  5 files changed, 346 insertions(+)
>>>  create mode 100644 libavformat/ipfsgateway.c
>>>
>>> diff --git a/configure b/configure
>>> index 5b19a35f59..6ff09e7974 100755
>>> --- a/configure
>>> +++ b/configure
>>> @@ -3585,6 +3585,8 @@ udp_protocol_select="network"
>>>  udplite_protocol_select="network"
>>>  unix_protocol_deps="sys_un_h"
>>>  unix_protocol_select="network"
>>> +ipfs_protocol_select="https_protocol"
>>> +ipns_protocol_select="https_protocol"
>>>
>>>  # external library protocols
>>>  libamqp_protocol_deps="librabbitmq"
>>> diff --git a/doc/protocols.texi b/doc/protocols.texi
>>> index d207df0b52..7c9c0a4808 100644
>>> --- a/doc/protocols.texi
>>> +++ b/doc/protocols.texi
>>> @@ -2025,5 +2025,35 @@ decoding errors.
>>>
>>>  @end table
>>>
>>> +@section ipfs
>>> +
>>> +InterPlanetary File System (IPFS) protocol support. One can access
>>> files stored
>>> +on the IPFS network through so called gateways. Those are http(s)
>>> endpoints.
>>> +This protocol wraps the IPFS native protocols (ipfs:// and ipns://) to
>>> be send
>>> +to such a gateway. Users can (and should) host their own node which
>>> means this
>>> +protocol will use your local machine gateway to access files on the
>>> IPFS network.
>>> +
>>> +If a user doesn't have a node of their own then the public gateway
>>> dweb.link is
>>> +used by default.
>>> +
>>> +You can use this protocol in 2 ways. Using IPFS:
>>> +@example
>>> +ffplay ipfs://QmbGtJg23skhvFmu9mJiePVByhfzu5rwo74MEkVDYAmF5T
>>> +@end example
>>> +
>>> +Or the IPNS protocol (IPNS is mutable IPFS):
>>> +@example
>>> +ffplay ipns://QmbGtJg23skhvFmu9mJiePVByhfzu5rwo74MEkVDYAmF5T
>>> +@end example
>>> +
>>> +You can also change the gateway to be used:
>>> +
>>> +@table @option
>>> +
>>> +@item gateway
>>> +Defines the gateway to use. When nothing is provided the protocol will
>>> first try
>>> +your local gateway. If that fails dweb.link will be used.
>>> +
>>> +@end table
>>>
>>>  @c man end PROTOCOLS
>>> diff --git a/libavformat/Makefile b/libavformat/Makefile
>>> index 3dc6a479cc..4edce8420f 100644
>>> --- a/libavformat/Makefile
>>> +++ b/libavformat/Makefile
>>> @@ -656,6 +656,8 @@ OBJS-$(CONFIG_SRTP_PROTOCOL) +=
>>> srtpproto.o srtp.o
>>>  OBJS-$(CONFIG_SUBFILE_PROTOCOL)  += subfile.o
>>>  OBJS-$(CONFIG_TEE_PROTOCOL)  += teeproto.o tee_common.o
>>>  OBJS-$(CONFIG_TCP_PROTOCOL)  += tcp.o
>>> +OBJS-$(CONFIG_IPFS_PROTOCOL) += ipfsgateway.o
>>> +OBJS-$(CONFIG_IPNS_PROTOCOL) += ipfsgateway.o
>>>  TLS-OBJS-$(CONFIG_GNUTLS)+= tls_gnutls.o
>>>  TLS-OBJS-$(CONFIG_LIBTLS)+= tls_libtls.o
>>>  TLS-OBJS-$(CONFIG_MBEDTLS)   += tls_mbedtls.o
>>> diff --git a/libavformat/ipfsgateway.c b/libavformat/ipfsgateway.c
>>> new file mode 100644
>>> index 00..2b2905d2c2
>>> --- /dev/null
>>> +++ b/libavformat/ipfsgateway.c
>>> @@ -0,0 +1,310 @@
>>> +/*
>>> + * IPFS and IPNS protocol support through IPFS Gateway.
>>> + * Copyright (c) 2022 Mark Gaiser
>>> + *
>>> + * 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 shou

Re: [FFmpeg-devel] [PATCH 1/4] avutil: add ambient viewing environment metadata side data

2022-03-27 Thread James Almer




On 3/27/2022 8:25 PM, lance.lmw...@gmail.com wrote:

From: Limin Wang 

Signed-off-by: Limin Wang 
---
  libavutil/Makefile   |  2 +
  libavutil/ambient_viewing_env_metadata.c | 47 +
  libavutil/ambient_viewing_env_metadata.h | 72 
  libavutil/frame.c|  1 +
  libavutil/frame.h|  6 +++
  5 files changed, 128 insertions(+)
  create mode 100644 libavutil/ambient_viewing_env_metadata.c
  create mode 100644 libavutil/ambient_viewing_env_metadata.h

diff --git a/libavutil/Makefile b/libavutil/Makefile
index 81df3b0..e388d33 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -26,6 +26,7 @@ HEADERS = adler32.h   
  \
display.h \
dovi_meta.h   \
downmix_info.h\
+  ambient_viewing_env_metadata.h\
encryption_info.h \
error.h   \
eval.h\
@@ -119,6 +120,7 @@ OBJS = adler32.o
\
 display.o\
 dovi_meta.o  \
 downmix_info.o   \
+   ambient_viewing_env_metadata.o   \
 encryption_info.o\
 error.o  \
 eval.o   \
diff --git a/libavutil/ambient_viewing_env_metadata.c 
b/libavutil/ambient_viewing_env_metadata.c
new file mode 100644
index 000..7006b64
--- /dev/null
+++ b/libavutil/ambient_viewing_env_metadata.c
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2022 Limin Wang 
+ *
+ * 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 
+#include 
+#include "ambient_viewing_env_metadata.h"
+#include "mem.h"
+
+AVAmbientViewingEnvMetadata *av_ambient_viewing_env_metadata_alloc(size_t 
*size)
+{
+AVAmbientViewingEnvMetadata *metadata = av_mallocz(sizeof(*metadata));
+
+if (size)
+*size = sizeof(*metadata);
+
+return metadata;
+}
+
+AVAmbientViewingEnvMetadata 
*av_ambient_viewing_env_metadata_create_side_data(AVFrame *frame)
+{
+AVFrameSideData *side_data = av_frame_new_side_data(frame,
+AV_FRAME_DATA_AMBIENT_VIEWING_ENV,
+sizeof(AVAmbientViewingEnvMetadata));
+if (!side_data)
+return NULL;
+
+memset(side_data->data, 0, sizeof(AVAmbientViewingEnvMetadata));
+
+return (AVAmbientViewingEnvMetadata *)side_data->data;
+}
diff --git a/libavutil/ambient_viewing_env_metadata.h 
b/libavutil/ambient_viewing_env_metadata.h
new file mode 100644
index 000..b0fbcd0
--- /dev/null
+++ b/libavutil/ambient_viewing_env_metadata.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2022 Limin Wang 
+ *
+ * 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
+ */
+
+#ifndef AVUTIL_AMBIENT_VIEWING_ENV_METADATA_H
+#define AVUTIL_AMBIENT_VIEWING_ENV_METADATA_H
+
+#include "frame.h"
+
+
+/**
+ * The characteristics of the nominal ambient viewing environmen

[FFmpeg-devel] [PATCH 4/4] fftools/ffprobe: add support for ambient viewing environment metadata

2022-03-27 Thread lance . lmwang
From: Limin Wang 

Signed-off-by: Limin Wang 
---
 fftools/ffprobe.c  | 6 ++
 tests/ref/fate/hevc-dv-rpu | 6 ++
 2 files changed, 12 insertions(+)

diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c
index 05c167e..5abe496 100644
--- a/fftools/ffprobe.c
+++ b/fftools/ffprobe.c
@@ -52,6 +52,7 @@
 #include "libavutil/parseutils.h"
 #include "libavutil/timecode.h"
 #include "libavutil/timestamp.h"
+#include "libavutil/ambient_viewing_env_metadata.h"
 #include "libavdevice/avdevice.h"
 #include "libavdevice/version.h"
 #include "libswscale/swscale.h"
@@ -2605,6 +2606,11 @@ static void show_frame(WriterContext *w, AVFrame *frame, 
AVStream *stream,
 AVContentLightMetadata *metadata = (AVContentLightMetadata 
*)sd->data;
 print_int("max_content", metadata->MaxCLL);
 print_int("max_average", metadata->MaxFALL);
+} else if (sd->type == AV_FRAME_DATA_AMBIENT_VIEWING_ENV) {
+AVAmbientViewingEnvMetadata *metadata = 
(AVAmbientViewingEnvMetadata *)sd->data;
+print_int("ambient_illuminance", 
metadata->ambient_illuminance);
+print_int("ambient_light_x", metadata->ambient_light_x);
+print_int("ambient_light_y", metadata->ambient_light_y);
 } else if (sd->type == AV_FRAME_DATA_ICC_PROFILE) {
 const AVDictionaryEntry *tag = av_dict_get(sd->metadata, 
"name", NULL, AV_DICT_MATCH_CASE);
 if (tag)
diff --git a/tests/ref/fate/hevc-dv-rpu b/tests/ref/fate/hevc-dv-rpu
index 6879f71..4ad5436 100644
--- a/tests/ref/fate/hevc-dv-rpu
+++ b/tests/ref/fate/hevc-dv-rpu
@@ -119,6 +119,9 @@ source_diagonal=42
 [/SIDE_DATA]
 [SIDE_DATA]
 side_data_type=Ambient Viewing Environment
+ambient_illuminance=314
+ambient_light_x=15635
+ambient_light_y=16450
 [/SIDE_DATA]
 [/FRAME]
 [FRAME]
@@ -239,5 +242,8 @@ source_diagonal=42
 [/SIDE_DATA]
 [SIDE_DATA]
 side_data_type=Ambient Viewing Environment
+ambient_illuminance=314
+ambient_light_x=15635
+ambient_light_y=16450
 [/SIDE_DATA]
 [/FRAME]
-- 
1.8.3.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] [PATCH 3/4] avfilter/vf_showinfo: add support for ambient viewing environment metadata

2022-03-27 Thread lance . lmwang
From: Limin Wang 

Signed-off-by: Limin Wang 
---
 libavfilter/vf_showinfo.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/libavfilter/vf_showinfo.c b/libavfilter/vf_showinfo.c
index 12d3931..ad86251 100644
--- a/libavfilter/vf_showinfo.c
+++ b/libavfilter/vf_showinfo.c
@@ -42,6 +42,7 @@
 #include "libavutil/mastering_display_metadata.h"
 #include "libavutil/video_enc_params.h"
 #include "libavutil/detection_bbox.h"
+#include "libavutil/ambient_viewing_env_metadata.h"
 
 #include "avfilter.h"
 #include "internal.h"
@@ -651,6 +652,15 @@ static void dump_color_property(AVFilterContext *ctx, 
AVFrame *frame)
 av_log(ctx, AV_LOG_INFO, "\n");
 }
 
+static void dump_ambient_viewing_env_metadata(AVFilterContext *ctx, 
AVFrameSideData *sd)
+{
+const AVAmbientViewingEnvMetadata *metadata = (const 
AVAmbientViewingEnvMetadata *)sd->data;
+
+av_log(ctx, AV_LOG_INFO, "Ambient Viewing Environment metadata: \n");
+av_log(ctx, AV_LOG_INFO, "ambient_illuminance=%d, ambient_light_x=%d, 
ambient_light_y=%d",
+   metadata->ambient_illuminance, metadata->ambient_light_x, 
metadata->ambient_light_y);
+}
+
 static void update_sample_stats_8(const uint8_t *src, int len, int64_t *sum, 
int64_t *sum2)
 {
 int i;
@@ -812,6 +822,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame 
*frame)
 case AV_FRAME_DATA_DOVI_METADATA:
 dump_dovi_metadata(ctx, sd);
 break;
+case AV_FRAME_DATA_AMBIENT_VIEWING_ENV:
+ dump_ambient_viewing_env_metadata(ctx, sd);
+break;
 default:
 av_log(ctx, AV_LOG_WARNING, "unknown side data type %d "
"(%"SIZE_SPECIFIER" bytes)\n", sd->type, sd->size);
-- 
1.8.3.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] [PATCH 2/4] avcodec: add support for hevc ambient viewing environment SEI message

2022-03-27 Thread lance . lmwang
From: Limin Wang 

Signed-off-by: Limin Wang 
---
 libavcodec/hevc_sei.c  | 19 +++
 libavcodec/hevc_sei.h  |  8 
 libavcodec/hevcdec.c   | 11 +++
 tests/ref/fate/hevc-dv-rpu |  6 ++
 4 files changed, 44 insertions(+)

diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
index ec3036f..d94df4e 100644
--- a/libavcodec/hevc_sei.c
+++ b/libavcodec/hevc_sei.c
@@ -497,6 +497,23 @@ static int 
decode_film_grain_characteristics(HEVCSEIFilmGrainCharacteristics *h,
 return 0;
 }
 
+static int decode_ambient_viewing_env(HEVCSEIAmbientViewingEnvironment *s, 
GetBitContext *gb, int size)
+{
+if (size < 8)
+return AVERROR_INVALIDDATA;
+
+s->ambient_illuminance  = get_bits(gb, 32);
+s->ambient_light_x  = get_bits(gb, 16);
+s->ambient_light_y  = get_bits(gb, 16);
+size -= 8;
+
+s->present = 1;
+
+skip_bits_long(gb, 8 * size);
+return  0;
+}
+
+
 static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s,
  const HEVCParamSets *ps, int type, int size)
 {
@@ -525,6 +542,8 @@ static int decode_nal_sei_prefix(GetBitContext *gb, void 
*logctx, HEVCSEI *s,
 return decode_nal_sei_timecode(&s->timecode, gb);
 case SEI_TYPE_FILM_GRAIN_CHARACTERISTICS:
 return 
decode_film_grain_characteristics(&s->film_grain_characteristics, gb);
+case SEI_TYPE_AMBIENT_VIEWING_ENVIRONMENT:
+return decode_ambient_viewing_env(&s->ambient_viewing_env, gb, size);
 default:
 av_log(logctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type);
 skip_bits_long(gb, 8 * size);
diff --git a/libavcodec/hevc_sei.h b/libavcodec/hevc_sei.h
index f198402..c7623f5 100644
--- a/libavcodec/hevc_sei.h
+++ b/libavcodec/hevc_sei.h
@@ -134,6 +134,13 @@ typedef struct HEVCSEIFilmGrainCharacteristics {
 int persistence_flag;
 } HEVCSEIFilmGrainCharacteristics;
 
+typedef struct HEVCSEIAmbientViewingEnvironment {
+int present;
+uint32_t ambient_illuminance;
+uint16_t ambient_light_x;
+uint16_t ambient_light_y;
+} HEVCSEIAmbientViewingEnvironment;
+
 typedef struct HEVCSEI {
 HEVCSEIPictureHash picture_hash;
 HEVCSEIFramePacking frame_packing;
@@ -149,6 +156,7 @@ typedef struct HEVCSEI {
 HEVCSEIAlternativeTransfer alternative_transfer;
 HEVCSEITimeCode timecode;
 HEVCSEIFilmGrainCharacteristics film_grain_characteristics;
+HEVCSEIAmbientViewingEnvironment ambient_viewing_env;
 } HEVCSEI;
 
 struct HEVCParamSets;
diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c
index 09c07ac..9be366e 100644
--- a/libavcodec/hevcdec.c
+++ b/libavcodec/hevcdec.c
@@ -36,6 +36,7 @@
 #include "libavutil/pixdesc.h"
 #include "libavutil/stereo3d.h"
 #include "libavutil/timecode.h"
+#include "libavutil/ambient_viewing_env_metadata.h"
 
 #include "bswapdsp.h"
 #include "bytestream.h"
@@ -2998,6 +2999,15 @@ static int set_side_data(HEVCContext *s)
 }
 }
 
+if (s->sei.ambient_viewing_env.present > 0) {
+AVAmbientViewingEnvMetadata *metadata = 
av_ambient_viewing_env_metadata_create_side_data(out);
+if (!metadata)
+return AVERROR(ENOMEM);
+metadata->ambient_illuminance = 
s->sei.ambient_viewing_env.ambient_illuminance;
+metadata->ambient_light_x = s->sei.ambient_viewing_env.ambient_light_x;
+metadata->ambient_light_y = s->sei.ambient_viewing_env.ambient_light_y;
+}
+
 return 0;
 }
 
@@ -3800,6 +3810,7 @@ static int hevc_update_thread_context(AVCodecContext *dst,
 s->sei.mastering_display= s0->sei.mastering_display;
 s->sei.content_light= s0->sei.content_light;
 s->sei.alternative_transfer = s0->sei.alternative_transfer;
+s->sei.ambient_viewing_env  = s0->sei.ambient_viewing_env;
 
 ret = export_stream_params_from_sei(s);
 if (ret < 0)
diff --git a/tests/ref/fate/hevc-dv-rpu b/tests/ref/fate/hevc-dv-rpu
index 1980ab1..6879f71 100644
--- a/tests/ref/fate/hevc-dv-rpu
+++ b/tests/ref/fate/hevc-dv-rpu
@@ -117,6 +117,9 @@ source_min_pq=0
 source_max_pq=3079
 source_diagonal=42
 [/SIDE_DATA]
+[SIDE_DATA]
+side_data_type=Ambient Viewing Environment
+[/SIDE_DATA]
 [/FRAME]
 [FRAME]
 [SIDE_DATA]
@@ -234,4 +237,7 @@ source_min_pq=0
 source_max_pq=3079
 source_diagonal=42
 [/SIDE_DATA]
+[SIDE_DATA]
+side_data_type=Ambient Viewing Environment
+[/SIDE_DATA]
 [/FRAME]
-- 
1.8.3.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] [PATCH 1/4] avutil: add ambient viewing environment metadata side data

2022-03-27 Thread lance . lmwang
From: Limin Wang 

Signed-off-by: Limin Wang 
---
 libavutil/Makefile   |  2 +
 libavutil/ambient_viewing_env_metadata.c | 47 +
 libavutil/ambient_viewing_env_metadata.h | 72 
 libavutil/frame.c|  1 +
 libavutil/frame.h|  6 +++
 5 files changed, 128 insertions(+)
 create mode 100644 libavutil/ambient_viewing_env_metadata.c
 create mode 100644 libavutil/ambient_viewing_env_metadata.h

diff --git a/libavutil/Makefile b/libavutil/Makefile
index 81df3b0..e388d33 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -26,6 +26,7 @@ HEADERS = adler32.h   
  \
   display.h \
   dovi_meta.h   \
   downmix_info.h\
+  ambient_viewing_env_metadata.h\
   encryption_info.h \
   error.h   \
   eval.h\
@@ -119,6 +120,7 @@ OBJS = adler32.o
\
display.o\
dovi_meta.o  \
downmix_info.o   \
+   ambient_viewing_env_metadata.o   \
encryption_info.o\
error.o  \
eval.o   \
diff --git a/libavutil/ambient_viewing_env_metadata.c 
b/libavutil/ambient_viewing_env_metadata.c
new file mode 100644
index 000..7006b64
--- /dev/null
+++ b/libavutil/ambient_viewing_env_metadata.c
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2022 Limin Wang 
+ *
+ * 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 
+#include 
+#include "ambient_viewing_env_metadata.h"
+#include "mem.h"
+
+AVAmbientViewingEnvMetadata *av_ambient_viewing_env_metadata_alloc(size_t 
*size)
+{
+AVAmbientViewingEnvMetadata *metadata = av_mallocz(sizeof(*metadata));
+
+if (size)
+*size = sizeof(*metadata);
+
+return metadata;
+}
+
+AVAmbientViewingEnvMetadata 
*av_ambient_viewing_env_metadata_create_side_data(AVFrame *frame)
+{
+AVFrameSideData *side_data = av_frame_new_side_data(frame,
+AV_FRAME_DATA_AMBIENT_VIEWING_ENV,
+sizeof(AVAmbientViewingEnvMetadata));
+if (!side_data)
+return NULL;
+
+memset(side_data->data, 0, sizeof(AVAmbientViewingEnvMetadata));
+
+return (AVAmbientViewingEnvMetadata *)side_data->data;
+}
diff --git a/libavutil/ambient_viewing_env_metadata.h 
b/libavutil/ambient_viewing_env_metadata.h
new file mode 100644
index 000..b0fbcd0
--- /dev/null
+++ b/libavutil/ambient_viewing_env_metadata.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2022 Limin Wang 
+ *
+ * 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
+ */
+
+#ifndef AVUTIL_AMBIENT_VIEWING_ENV_METADATA_H
+#define AVUTIL_AMBIENT_VIEWING_ENV_METADATA_H
+
+#include "frame.h"
+
+
+/**
+ * The characteristics of the nominal ambient viewing environment for
+ * the display of the associated video content.
+ * To be used as payl

[FFmpeg-devel] [PATCH] avcodec/libsvtav1: give svtav1-params priority over avctx values

2022-03-27 Thread James Almer
If the svt equivalent option to an avctx AVOption is passed by the user
then it should have priority. The exception are fields like dimensions, bitdepth
and pixel format, which must match what lavc will feed the encoder after init.

This addresses libsvt-av1 issue #1858.

Signed-off-by: James Almer 
---
 libavcodec/libsvtav1.c | 69 +-
 1 file changed, 34 insertions(+), 35 deletions(-)

diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c
index 6cf280377e..41428a3b61 100644
--- a/libavcodec/libsvtav1.c
+++ b/libavcodec/libsvtav1.c
@@ -178,6 +178,9 @@ static int config_enc_params(EbSvtAv1EncConfiguration 
*param,
 param->rate_control_mode = 1;
 else
 param->rate_control_mode = 2;
+
+param->max_qp_allowed   = avctx->qmax;
+param->min_qp_allowed   = avctx->qmin;
 }
 param->max_bit_rate = avctx->rc_max_rate;
 param->vbv_bufsize  = avctx->rc_buffer_size;
@@ -191,6 +194,37 @@ static int config_enc_params(EbSvtAv1EncConfiguration 
*param,
 param->enable_adaptive_quantization = 0;
 }
 
+desc = av_pix_fmt_desc_get(avctx->pix_fmt);
+param->color_primaries  = avctx->color_primaries;
+param->matrix_coefficients  = (desc->flags & AV_PIX_FMT_FLAG_RGB) ?
+  AVCOL_SPC_RGB : avctx->colorspace;
+param->transfer_characteristics = avctx->color_trc;
+
+if (avctx->color_range != AVCOL_RANGE_UNSPECIFIED)
+param->color_range = avctx->color_range == AVCOL_RANGE_JPEG;
+else
+param->color_range = !!(desc->flags & AV_PIX_FMT_FLAG_RGB);
+
+if (avctx->profile != FF_PROFILE_UNKNOWN)
+param->profile = avctx->profile;
+
+if (avctx->level != FF_LEVEL_UNKNOWN)
+param->level = avctx->level;
+
+if (avctx->gop_size > 0)
+param->intra_period_length  = avctx->gop_size - 1;
+
+if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
+param->frame_rate_numerator   = avctx->framerate.num;
+param->frame_rate_denominator = avctx->framerate.den;
+} else {
+param->frame_rate_numerator   = avctx->time_base.den;
+param->frame_rate_denominator = avctx->time_base.num * 
avctx->ticks_per_frame;
+}
+
+/* 2 = IDR, closed GOP, 1 = CRA, open GOP */
+param->intra_refresh_type = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP ? 2 : 
1;
+
 #if SVT_AV1_CHECK_VERSION(0, 9, 1)
 while ((en = av_dict_get(svt_enc->svtav1_opts, "", en, 
AV_DICT_IGNORE_SUFFIX))) {
 EbErrorType ret = svt_av1_enc_parse_parameter(param, en->key, 
en->value);
@@ -214,7 +248,6 @@ static int config_enc_params(EbSvtAv1EncConfiguration 
*param,
 param->source_width = avctx->width;
 param->source_height= avctx->height;
 
-desc = av_pix_fmt_desc_get(avctx->pix_fmt);
 param->encoder_bit_depth = desc->comp[0].depth;
 
 if (desc->log2_chroma_w == 1 && desc->log2_chroma_h == 1)
@@ -228,22 +261,6 @@ static int config_enc_params(EbSvtAv1EncConfiguration 
*param,
 return AVERROR(EINVAL);
 }
 
-param->color_primaries  = avctx->color_primaries;
-param->matrix_coefficients  = (desc->flags & AV_PIX_FMT_FLAG_RGB) ?
-  AVCOL_SPC_RGB : avctx->colorspace;
-param->transfer_characteristics = avctx->color_trc;
-
-if (avctx->color_range != AVCOL_RANGE_UNSPECIFIED)
-param->color_range = avctx->color_range == AVCOL_RANGE_JPEG;
-else
-param->color_range = !!(desc->flags & AV_PIX_FMT_FLAG_RGB);
-
-if (avctx->profile != FF_PROFILE_UNKNOWN)
-param->profile = avctx->profile;
-
-if (avctx->level != FF_LEVEL_UNKNOWN)
-param->level = avctx->level;
-
 if ((param->encoder_color_format == EB_YUV422 || param->encoder_bit_depth 
> 10)
  && param->profile != FF_PROFILE_AV1_PROFESSIONAL ) {
 av_log(avctx, AV_LOG_WARNING, "Forcing Professional profile\n");
@@ -253,25 +270,7 @@ static int config_enc_params(EbSvtAv1EncConfiguration 
*param,
 param->profile = FF_PROFILE_AV1_HIGH;
 }
 
-if (avctx->gop_size > 0)
-param->intra_period_length  = avctx->gop_size - 1;
-
-if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
-param->frame_rate_numerator   = avctx->framerate.num;
-param->frame_rate_denominator = avctx->framerate.den;
-} else {
-param->frame_rate_numerator   = avctx->time_base.den;
-param->frame_rate_denominator = avctx->time_base.num * 
avctx->ticks_per_frame;
-}
-
 avctx->bit_rate = param->target_bit_rate;
-if (avctx->bit_rate) {
-param->max_qp_allowed   = avctx->qmax;
-param->min_qp_allowed   = avctx->qmin;
-}
-
-/* 2 = IDR, closed GOP, 1 = CRA, open GOP */
-param->intra_refresh_type = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP ? 2 : 
1;
 
 return 0;
 }
-- 
2.35.1

__

Re: [FFmpeg-devel] [PATCH] avfilter/alimiter: Add "flush_buffer" option to flush the remaining valid data to the output

2022-03-27 Thread Marton Balint




On Sat, 26 Mar 2022, Wang Cao wrote:


The change in the commit will add some samples to the end of the audio
stream. The intention is to add a "zero_delay" option eventually to not
have the delay in the begining the output from alimiter due to
lookahead.


I was very much suprised to see that the alimiter filter actually delays 
the audio - as in extra samples are inserted in the beginning and some 
samples are cut in the end. This trashes A-V sync, so it is a bug IMHO.


So unless somebody has some valid usecase for the legacy way of operation 
I'd just simply change it to be "zero delay" without any additional user 
option, in a single patch.


Regards,
Marton
___
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/2] avcodec/libsvtav1: clean up unconditional override of avctx bit rate

2022-03-27 Thread Jan Ekström
This value is only documented to be utilized if rate control is
set to one of the bit rate based modes. These modes are not the
default and thus the wrapper itself configures a bit rate according
to the avctx if bit rate based encoding is requested, making the
relevant value already be set when relevant.
---
 libavcodec/libsvtav1.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c
index d89fefdf4c..fe0d100beb 100644
--- a/libavcodec/libsvtav1.c
+++ b/libavcodec/libsvtav1.c
@@ -271,7 +271,6 @@ static int config_enc_params(EbSvtAv1EncConfiguration 
*param,
 param->frame_rate_denominator = avctx->time_base.num * 
avctx->ticks_per_frame;
 }
 
-avctx->bit_rate = param->target_bit_rate;
 if (avctx->bit_rate) {
 param->max_qp_allowed   = avctx->qmax;
 param->min_qp_allowed   = avctx->qmin;
-- 
2.35.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] [PATCH 1/2] avcodec/libsvtav1: signal CPB properties through side data

2022-03-27 Thread Jan Ekström
This way values such as maxrate/bufsize can be utilized further
down the chain.

The libavcodec values are utilized instead of from the encoder
configuration struct since:

1) both utilize bits per second, so no loss of precision occured.
2) the struct defaults various values to nonzero - even though it
   is documented to be unused outside of bit rate based rate
   control modes.
---
 libavcodec/libsvtav1.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c
index 6cf280377e..d89fefdf4c 100644
--- a/libavcodec/libsvtav1.c
+++ b/libavcodec/libsvtav1.c
@@ -156,6 +156,9 @@ static int config_enc_params(EbSvtAv1EncConfiguration 
*param,
 SvtContext *svt_enc = avctx->priv_data;
 const AVPixFmtDescriptor *desc;
 AVDictionaryEntry *en = NULL;
+AVCPBProperties *cpb_props = ff_add_cpb_side_data(avctx);
+if (!cpb_props)
+return AVERROR(ENOMEM);
 
 // Update param from options
 #if FF_API_SVTAV1_OPTS
@@ -191,6 +194,10 @@ static int config_enc_params(EbSvtAv1EncConfiguration 
*param,
 param->enable_adaptive_quantization = 0;
 }
 
+cpb_props->buffer_size = avctx->rc_buffer_size;
+cpb_props->max_bitrate = avctx->rc_max_rate;
+cpb_props->avg_bitrate = avctx->bit_rate;;
+
 #if SVT_AV1_CHECK_VERSION(0, 9, 1)
 while ((en = av_dict_get(svt_enc->svtav1_opts, "", en, 
AV_DICT_IGNORE_SUFFIX))) {
 EbErrorType ret = svt_av1_enc_parse_parameter(param, en->key, 
en->value);
-- 
2.35.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] [PATCH] Add decoding of > 32-bit residuals to FLAC

2022-03-27 Thread Martijn van Beurden
The size of residuals in a FLAC file coding for 24-bit PCM can
exceed the range of a 32-bit signed integer. One pathological
example with residuals exceeding [-2^33,2^33) can be found here:
http://www.audiograaf.nl/misc_stuff/Extreme%20residual%20LPC%20order%2014.flac

The theorectical maximum bit depth for a residual in a FLAC file is
32 + 1 + 15 + 5 - 0 = 53 bit (max bit depth + extra bit for side
channel + max lpc coeff precision + log2(max_order) - min
lpc shift)

This patch adds detection of the possibilty of such residuals
occuring and an alternate data path wide enough to handle them
---
 libavcodec/flacdec.c | 107 ++-
 libavcodec/golomb.h  |  56 ++
 2 files changed, 152 insertions(+), 11 deletions(-)

diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c
index dd6026f9de..3be1b63411 100644
--- a/libavcodec/flacdec.c
+++ b/libavcodec/flacdec.c
@@ -64,6 +64,8 @@ typedef struct FLACContext {
 uint8_t *decoded_buffer;
 unsigned int decoded_buffer_size;
 int buggy_lpc;  ///< use workaround for old lavc 
encoded files
+int64_t *residual64;///< to keep residuals exceeding 
int32_t
+unsigned int residual64_size;
 
 FLACDSPContext dsp;
 } FLACContext;
@@ -149,6 +151,10 @@ static int allocate_buffers(FLACContext *s)
 if (!s->decoded_buffer)
 return AVERROR(ENOMEM);
 
+av_fast_malloc(&s->residual64, &s->residual64_size, 
8*s->flac_stream_info.max_blocksize);
+if (!s->residual64)
+return AVERROR(ENOMEM);
+
 ret = av_samples_fill_arrays((uint8_t **)s->decoded, NULL,
  s->decoded_buffer,
  s->flac_stream_info.channels,
@@ -279,6 +285,66 @@ static int decode_residuals(FLACContext *s, int32_t 
*decoded, int pred_order)
 return 0;
 }
 
+static int decode_residuals64(FLACContext *s, int64_t *decoded, int pred_order)
+{
+GetBitContext gb = s->gb;
+int i, tmp, partition, method_type, rice_order;
+int rice_bits, rice_esc;
+int samples;
+
+method_type = get_bits(&gb, 2);
+rice_order  = get_bits(&gb, 4);
+
+samples   = s->blocksize >> rice_order;
+rice_bits = 4 + method_type;
+rice_esc  = (1 << rice_bits) - 1;
+
+decoded += pred_order;
+i= pred_order;
+
+if (method_type > 1) {
+av_log(s->avctx, AV_LOG_ERROR, "illegal residual coding method %d\n",
+   method_type);
+return AVERROR_INVALIDDATA;
+}
+
+if (samples << rice_order != s->blocksize) {
+av_log(s->avctx, AV_LOG_ERROR, "invalid rice order: %i blocksize %i\n",
+   rice_order, s->blocksize);
+return AVERROR_INVALIDDATA;
+}
+
+if (pred_order > samples) {
+av_log(s->avctx, AV_LOG_ERROR, "invalid predictor order: %i > %i\n",
+   pred_order, samples);
+return AVERROR_INVALIDDATA;
+}
+
+for (partition = 0; partition < (1 << rice_order); partition++) {
+tmp = get_bits(&gb, rice_bits);
+if (tmp == rice_esc) {
+tmp = get_bits(&gb, 5);
+for (; i < samples; i++)
+*decoded++ = get_sbits_long(&gb, tmp);
+} else {
+for (; i < samples; i++) {
+int64_t v = get_sr_golomb64_flac(&gb, tmp, 1);
+if (v == INT64_MAX) {
+av_log(s->avctx, AV_LOG_ERROR, "invalid residual\n");
+return AVERROR_INVALIDDATA;
+}
+
+*decoded++ = v;
+}
+}
+i = 0;
+}
+
+s->gb = gb;
+
+return 0;
+}
+
 static int decode_subframe_fixed(FLACContext *s, int32_t *decoded,
  int pred_order, int bps)
 {
@@ -358,6 +424,21 @@ static void lpc_analyze_remodulate(SUINT32 *decoded, const 
int coeffs[32],
 }
 }
 
+static void lpc_residual64(int32_t *decoded, const int64_t *residual,
+   const int coeffs[32], int pred_order,
+   int qlevel, int len)
+{
+int i, j;
+
+for (i = pred_order; i < len; i++, decoded++) {
+int64_t sum = 0;
+for (j = 0; j < pred_order; j++)
+sum += (int64_t)coeffs[j] * decoded[j];
+decoded[j] = residual[i] + (sum >> qlevel);
+}
+
+}
+
 static int decode_subframe_lpc(FLACContext *s, int32_t *decoded, int 
pred_order,
int bps)
 {
@@ -386,19 +467,23 @@ static int decode_subframe_lpc(FLACContext *s, int32_t 
*decoded, int pred_order,
 coeffs[pred_order - i - 1] = get_sbits(&s->gb, coeff_prec);
 }
 
-if ((ret = decode_residuals(s, decoded, pred_order)) < 0)
-return ret;
-
-if (   (s->buggy_lpc && s->flac_stream_info.bps <= 16)
-|| (   !s->buggy_lpc && bps <= 16
-&& bps + coeff_prec + av_log2(pred_order) <= 32)) {
-s->dsp.lpc16(decoded, coeffs, pred_order, qlevel, s->blocksize);
+if (bps

Re: [FFmpeg-devel] [PATCH] Add and use cli options for v4l2

2022-03-27 Thread Neal Gompa
On Fri, Mar 25, 2022 at 10:40 PM  wrote:
>
> Oops, accidentally submitted with the wrong title so not in the right thread.
> Is submitted with the right one now.
>
> A re-submit of a re-base of a formerly proposed patch to align with ffmpeg 
> github
> commit 8ae15b565533944d042d3caf25f7262e002e8953
> as at 2022.03.26 ACST, after ffmpeg changes overlapped the formerly proposed 
> patch.
>
> Add commandline options to v4l2_m2m_enc (h264_v4l2m2m only)
> and use those to configure options for the h264_v4l2m2m encoder.
> Uses AVOption options to filter for valid options per v4l2 spec.
> For h264 it adds spec-compliant:
> -profile  (high is max accepted by Raspberry Pi)
> -level(4.2 is max  accepted by Raspberry Pi)
> -rc   (Bitrate mode, VBR or CBR or CQ)
> -shm(Sequence Header Mode, separate_buffer or joined_1st_frame)
> -rsh   (Repeat Sequence Header 0(false) 1(true))
> -fsme   (Frame Skip Mode for encoder, rejected by Pi OS)
> -b:v   (Bit per second)
> -g (pseudo GOP size, not an actual one)
> -iframe_period  (the period between two I-frames)
> -qmin  (Minimum quantization parameter for h264)
> -qmax  (Maximum quantization parameter for h264)
>
> Patch does not address pre-existing quirks with h264_v4l2m2m,
> eg on a Raspberry Pi,
> - Bitrate mode VBR, file is reported by mediainfo as CBR
> - Bitrate mode CBR, encoder hangs and appears to
>   "lock" /dev/video11 until reboot
> - CFR input yields a VFR file reported by mediainfo (and an
>   odd framerate) whereas an equivalent libx264 commandline
>   yields expected CFR; tested on a Raspberry Pi4
> - Bitrate mode CBR, profile is limited to less than "high"
> - Bitrate mode VBR, only target bitrate option exposed to set
> - Bitrate mode CQ, is not exposed to set
>
> Notes:
> Patch arises from a desire to use ffmpeg on a Raspberry Pi (4 +).
> Fixes "--profile high" not working (required an integer).
> The Raspberry Pi OS does not expose a GOP size to set, so -g is
> used for backward compatibility with its value overriding
> the "close enough" effect of an "iframe_period" value.
> Hardware like Raspberry Pi 4 rejects some spec-compliant options
> beyond its capacity and/or not implemented by the Raspberry Pi OS.
> The Raspberry Pi OS repository for ffmpeg appears to have Repeat
> Sequence Header hard-coded as True, rather than a cli an option.
> Added more return value checking, AV_LOG_WARNING and a lot
> more AV_LOG_DEBUG code; one-time runtime cost of debug code
> during init phase is negligible.
> Intentionally left in //commented-out debug code.
>
> A working commandline using an interlaced source:
> /usr/local/bin/ffmpeg -hide_banner -nostats -v debug -i 
> "~/Desktop/input_file_tiny.mp4" -vsync cfr -sws_flags
> lanczos+accurate_rnd+full_chroma_int+full_chroma_inp -strict experimental 
> -filter_complex "[0:v]yadif=0:0:0,format=pix_fmts=yuv420p"
> -c:v h264_v4l2m2m -pix_fmt yuv420p -rc VBR -b:v 400 -qmin 10 -qmax 51 
> -profile:v high -level 4.2 -shm separate_buffer -rsh 0
> -g:v 25 -movflags +faststart+write_colr -an -y 
> "./output_file_tiny_h264_VBR_g25.mp4"
>
> Signed-off-by: hydra mailto:hydra3...@gmail.com> >

This looks like a malformed statement?

> ---

This patch looks reasonably good, but it doesn't work on my computer
running Fedora Linux 36 on my Raspberry Pi 400 with Linux 5.17.0. Is
the necessary kernel functionality upstreamed yet? Taking a look at
the kernel code, I don't see a driver for it[1], not even in
staging[2].

[1]: https://github.com/torvalds/linux/tree/master/drivers/media/platform
[2]: https://github.com/torvalds/linux/tree/master/drivers/staging/media


-- 
真実はいつも一つ!/ Always, there's only one truth!
___
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 v4 1/2] lavc/vaapi_encode: add support for maxframesize

2022-03-27 Thread Wang, Fei W



> -Original Message-
> From: Andriy Gelman 
> Sent: Saturday, March 26, 2022 11:21 PM
> To: Wang, Fei W 
> Cc: ffmpeg-devel@ffmpeg.org
> Subject: Re: [PATCH v4 1/2] lavc/vaapi_encode: add support for maxframesize
> 
> On Wed, 23. Mar 08:51, Wang, Fei W wrote:
> > > -Original Message-
> > > From: Wang, Fei W 
> > > Sent: Tuesday, March 22, 2022 10:11 PM
> > > To: ffmpeg-devel@ffmpeg.org
> > > Cc: Linjie Fu ; Wang, Fei W
> > > 
> > > Subject: [PATCH v4 1/2] lavc/vaapi_encode: add support for
> > > maxframesize
> > >
> > > From: Linjie Fu 
> > >
> > > Add support for max frame size:
> > > - max_frame_size (bytes) to indicate the max allowed size for frame.
> > >
> > > If the frame size exceeds the limitation, encoder will to control
> > > the frame size by adjusting QP value.
> > > - MFS_NUM_PASSES to indicate number of passes for QP adjust.
> > > - MFS_DELTA_QP to indicate adjust qp value per pass.
> > >
> > > To simplify the usage, default QP adjust is set to delta_qp[4] = {1, 1, 
> > > 1, 1}.
> > > Use new_qp for encoder if frame size exceeds the limitation:
> > > new_qp = base_qp + delta_qp[0] + delta_qp[1] + ...
> > >
> > > ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -f rawvideo \
> > > -v verbose -s:v 352x288 -i ./input.yuv -vf format=nv12,hwupload \
> > > -c:v h264_vaapi -profile:v main -g 30 -bf 3 -max_frame_size 4 
> > > \
> > > -vframes 100 -y ./max_frame_size.h264
> > >
> > > Max frame size was enabled since VA-API version (1, 3, 0), but query
> > > is available since (1, 5, 0). It will be passed as a parameter in
> > > picParam and should be set for each frame.
> > >
> > > Signed-off-by: Linjie Fu 
> > > Signed-off-by: Fei Wang 
> > > ---
> > > 1. re-send the 2 legacy patch:
> > > https://patchwork.ffmpeg.org/project/ffmpeg/patch/20190715105936.486
> > > 0-1-
> > > linjie...@intel.com/
> > > https://patchwork.ffmpeg.org/project/ffmpeg/patch/2019071511.506
> > > 9-1-
> > > linjie...@intel.com/
> > >
> > >  libavcodec/vaapi_encode.c | 67
> > > +++
> > >  libavcodec/vaapi_encode.h | 19 +--
> > >  2 files changed, 84 insertions(+), 2 deletions(-)
> 
> Hi,
> 
> >
> > Hi Andriy,
> >
> > Is there any way to know the details of failure for this patch? Like
> > OS, configuration, gcc version, etc. It looks good on my local Ubuntu with 
> > gcc
> 9.3, but show fails in patchwork checks:
> > https://patchwork.ffmpeg.org/project/ffmpeg/patch/20220322141119.59562
> > 7-1-fei.w.w...@intel.com/
> >
> 
> I don't think it was a real issue. I was upgrading the x86 runner at the time.

Thanks for your confirmation. 

@Haihao, could you help to review this patchset? Thanks.

Thanks
Fei
> 
> --
> Andriy
___
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/4] avformat/alp: Check num_channels

2022-03-27 Thread Michael Niedermayer
On Sun, Mar 20, 2022 at 02:47:36PM +0100, Michael Niedermayer wrote:
> Fixes: division by 0
> Fixes: 
> 45615/clusterfuzz-testcase-minimized-ffmpeg_dem_ALP_fuzzer-582660348405350
> Fixes: 
> 45625/clusterfuzz-testcase-minimized-ffmpeg_dem_ALP_fuzzer-4821437943250944
> 
> Found-by: continuous fuzzing process 
> https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
> Signed-off-by: Michael Niedermayer 
> ---
>  libavformat/alp.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

will apply patchset

[...]

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Why not whip the teacher when the pupil misbehaves? -- Diogenes of Sinope


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 2/2] avformat: Do not search through the AVOption table for a option not in it repeatedly on each packet

2022-03-27 Thread Michael Niedermayer
On Sat, Mar 26, 2022 at 03:25:09PM +0100, Paul B Mahol wrote:
> probably fine

will apply

thx

[...]
-- 
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
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] web/consulting: add myself

2022-03-27 Thread Michael Niedermayer
On Sun, Mar 27, 2022 at 10:02:47AM +0530, Gyan Doshi wrote:
> 
> 
> On 2022-03-27 05:15 am, Michael Niedermayer wrote:
> > On Thu, Mar 24, 2022 at 03:53:56PM +0100, Tomas Härdin wrote:
> > >   consulting |   12 
> > >   1 file changed, 12 insertions(+)
> > > 901f8f38d654798a4fcb579ac2e50c0a443f5843  
> > > 0001-web-consulting-add-myself.patch
> > >  From 446777e4333726cb05843ff16ac76e9eb83a5e57 Mon Sep 17 00:00:00 2001
> > > From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= 
> > > Date: Sun, 2 Jan 2022 15:47:30 +0100
> > > Subject: [PATCH] web/consulting: add myself
> > > 
> > > ---
> > >   src/consulting | 12 
> > >   1 file changed, 12 insertions(+)
> > > 
> > > diff --git a/src/consulting b/src/consulting
> > > index 01e4995..96a5b28 100644
> > > --- a/src/consulting
> > > +++ b/src/consulting
> > > @@ -106,6 +106,18 @@ E.g.:
> > > 
> > >
> > >  
> > > +  
> > > +
> > > +  Tomas Härdin
> > > +  
> > > +Tomas is located in Umeå, Sweden.
> > > +He has worked on FFmpeg since 2009 and has been a maintainer 
> > > since 2010.
> > > +He has expertise in broadcast formats, mainly MXF and AAF, and 
> > > is also available for general FFmpeg work.
> > > +For more information on Tomas' areas of expertise see  > > href="https://www.haerdin.se/pages/consulting.html";>the consulting page 
> > > on his website.
> > > +You can contact him by email at  > > href="mailto:consult...@haerdin.se";>consult...@haerdin.se or by XMPP 
> > > at t...@haerdin.se.
> > > +  
> > > + 
> > > +   
> > > 
> > >   
> > > Steven Liu
> > I applied this not realizing it messes the "table" style up a bit
> > maybe you can fix this
> 
> Done.

thx

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

Modern terrorism, a quick summary: Need oil, start war with country that
has oil, kill hundread thousand in war. Let country fall into chaos,
be surprised about raise of fundamantalists. Drop more bombs, kill more
people, be surprised about them taking revenge and drop even more bombs
and strip your own citizens of their rights and freedoms. to be continued


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