Re: [FFmpeg-devel] [PATCH v6 3/3] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Zhao Zhili



> On Feb 11, 2025, at 19:23, Andreas Rheinhardt 
>  wrote:
> 
> Zhao Zhili:
>> From: Zhao Zhili 
>> 
>> Signed-off-by: Zhao Zhili 
>> ---
>> libavcodec/hevc/hevcdec.c | 73 ++-
>> libavcodec/hevc/hevcdec.h |  2 ++
>> libavcodec/hevc/refs.c| 34 +-
>> 3 files changed, 107 insertions(+), 2 deletions(-)
>> 
>> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
>> index e9c045f7a1..f71edf213b 100644
>> --- a/libavcodec/hevc/hevcdec.c
>> +++ b/libavcodec/hevc/hevcdec.c
>> @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>> return 0;
>> }
>> 
>> +int ff_hevc_is_alpha_video(const HEVCContext *s)
>> +{
>> +const HEVCVPS *vps = s->vps;
>> +int ret = 0;
>> +
>> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
>> +return 0;
>> +
>> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
>> other
>> + * than alpha cannot reach here.
>> + */
>> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
>> +
>> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
>> +   ret ? "is" : "not");
>> +
>> +return ret;
>> +}
>> +
>> static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
>> {
>> unsigned layers_active_output = 0, highest_layer;
>> @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>> s->layers_active_output = 1;
>> s->layers_active_decode = 1;
>> 
>> +if (ff_hevc_is_alpha_video(s)) {
>> +const AVPixFmtDescriptor *desc = 
>> av_pix_fmt_desc_get(s->avctx->pix_fmt);
>> +
>> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
>> +return 0;
>> +
>> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
>> +s->layers_active_output = 1;
>> +
>> +return 0;
>> +}
>> +
>> // nothing requested - decode base layer only
>> if (!s->nb_view_ids)
>> return 0;
>> @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>> return 0;
>> }
>> 
>> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
>> +  enum AVPixelFormat pix_fmt)
>> +{
>> +switch (pix_fmt) {
>> +case AV_PIX_FMT_YUV420P:
>> +case AV_PIX_FMT_YUVJ420P:
>> +return AV_PIX_FMT_YUVA420P;
>> +case AV_PIX_FMT_YUV420P10:
>> +return AV_PIX_FMT_YUVA420P10;
>> +case AV_PIX_FMT_YUV444P:
>> +return AV_PIX_FMT_YUVA444P;
>> +case AV_PIX_FMT_YUV422P:
>> +return AV_PIX_FMT_YUVA422P;
>> +case AV_PIX_FMT_YUV422P10LE:
>> +return AV_PIX_FMT_YUVA422P10LE;
>> +case AV_PIX_FMT_YUV444P10:
>> +return AV_PIX_FMT_YUVA444P10;
>> +case AV_PIX_FMT_YUV444P12:
>> +return AV_PIX_FMT_YUVA444P12;
>> +case AV_PIX_FMT_YUV422P12:
>> +return AV_PIX_FMT_YUVA422P12;
>> +default:
>> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
>> %s\n",
>> +   av_get_pix_fmt_name(pix_fmt));
>> +return AV_PIX_FMT_NONE;
>> +}
>> +}
>> +
>> static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
>> {
>> #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
>> @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>> const HEVCSPS *sps)
>>  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
>>  CONFIG_HEVC_VDPAU_HWACCEL + \
>>  CONFIG_HEVC_VULKAN_HWACCEL)
>> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
>> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
>> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>> int ret;
>> 
>> +if (ff_hevc_is_alpha_video(s))
>> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
>> +
>> switch (sps->pix_fmt) {
>> case AV_PIX_FMT_YUV420P:
>> case AV_PIX_FMT_YUVJ420P:
>> @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>> const HEVCSPS *sps)
>> break;
>> }
>> 
>> +if (alpha_fmt != AV_PIX_FMT_NONE)
>> +*fmt++ = alpha_fmt;
>> *fmt++ = sps->pix_fmt;
>> *fmt = AV_PIX_FMT_NONE;
>> 
>> @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
>> HEVCLayerContext *l,
>> !sps->vui.common.video_signal_type_present_flag)
>> pix_fmt = sps_base->pix_fmt;
>> 
>> +// Ignore range mismatch between base layer and alpha layer
>> +if (ff_hevc_is_alpha_video(s) &&
>> +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
>> +pix_fmt == AV_PIX_FMT_YUVJ420P)
>> +pix_fmt = sps_base->pix_fmt;
>> +
>> if (pix_fmt != sps_base->pix_fmt ||
>> sps->width  != sps_base->width   ||
>> sps->height != sps_base->height) {
>> diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
>> i

[FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Zhao Zhili
From: Zhao Zhili 

Signed-off-by: Zhao Zhili 
---
 libavcodec/hevc/hevcdec.c | 73 ++-
 libavcodec/hevc/hevcdec.h |  2 ++
 libavcodec/hevc/refs.c| 35 ++-
 3 files changed, 108 insertions(+), 2 deletions(-)

diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
index e9c045f7a1..f71edf213b 100644
--- a/libavcodec/hevc/hevcdec.c
+++ b/libavcodec/hevc/hevcdec.c
@@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
 }
 
+int ff_hevc_is_alpha_video(const HEVCContext *s)
+{
+const HEVCVPS *vps = s->vps;
+int ret = 0;
+
+if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
+return 0;
+
+/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId other
+ * than alpha cannot reach here.
+ */
+ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
+
+av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
+   ret ? "is" : "not");
+
+return ret;
+}
+
 static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
 {
 unsigned layers_active_output = 0, highest_layer;
@@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 s->layers_active_output = 1;
 s->layers_active_decode = 1;
 
+if (ff_hevc_is_alpha_video(s)) {
+const AVPixFmtDescriptor *desc = 
av_pix_fmt_desc_get(s->avctx->pix_fmt);
+
+if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
+return 0;
+
+s->layers_active_decode = (1 << vps->nb_layers) - 1;
+s->layers_active_output = 1;
+
+return 0;
+}
+
 // nothing requested - decode base layer only
 if (!s->nb_view_ids)
 return 0;
@@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
 }
 
+static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
+  enum AVPixelFormat pix_fmt)
+{
+switch (pix_fmt) {
+case AV_PIX_FMT_YUV420P:
+case AV_PIX_FMT_YUVJ420P:
+return AV_PIX_FMT_YUVA420P;
+case AV_PIX_FMT_YUV420P10:
+return AV_PIX_FMT_YUVA420P10;
+case AV_PIX_FMT_YUV444P:
+return AV_PIX_FMT_YUVA444P;
+case AV_PIX_FMT_YUV422P:
+return AV_PIX_FMT_YUVA422P;
+case AV_PIX_FMT_YUV422P10LE:
+return AV_PIX_FMT_YUVA422P10LE;
+case AV_PIX_FMT_YUV444P10:
+return AV_PIX_FMT_YUVA444P10;
+case AV_PIX_FMT_YUV444P12:
+return AV_PIX_FMT_YUVA444P12;
+case AV_PIX_FMT_YUV422P12:
+return AV_PIX_FMT_YUVA422P12;
+default:
+av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for %s\n",
+   av_get_pix_fmt_name(pix_fmt));
+return AV_PIX_FMT_NONE;
+}
+}
+
 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
 {
 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
@@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
  CONFIG_HEVC_VDPAU_HWACCEL + \
  CONFIG_HEVC_VULKAN_HWACCEL)
-enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
+enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
+enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
 int ret;
 
+if (ff_hevc_is_alpha_video(s))
+alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
+
 switch (sps->pix_fmt) {
 case AV_PIX_FMT_YUV420P:
 case AV_PIX_FMT_YUVJ420P:
@@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
 break;
 }
 
+if (alpha_fmt != AV_PIX_FMT_NONE)
+*fmt++ = alpha_fmt;
 *fmt++ = sps->pix_fmt;
 *fmt = AV_PIX_FMT_NONE;
 
@@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
HEVCLayerContext *l,
 !sps->vui.common.video_signal_type_present_flag)
 pix_fmt = sps_base->pix_fmt;
 
+// Ignore range mismatch between base layer and alpha layer
+if (ff_hevc_is_alpha_video(s) &&
+sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
+pix_fmt == AV_PIX_FMT_YUVJ420P)
+pix_fmt = sps_base->pix_fmt;
+
 if (pix_fmt != sps_base->pix_fmt ||
 sps->width  != sps_base->width   ||
 sps->height != sps_base->height) {
diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
index 4e95035688..b2b725b5cd 100644
--- a/libavcodec/hevc/hevcdec.h
+++ b/libavcodec/hevc/hevcdec.h
@@ -714,6 +714,8 @@ void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, 
const HEVCPPS *pps,
 
 void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int 
log2_cb_size);
 
+int ff_hevc_is_alpha_video(const HEVCContext *s);
+
 extern const uint8_t ff_hevc_qpel_extra_before[4];
 extern const uint8_t ff_hevc_qpel_extra_after[4];
 extern const uint8

[FFmpeg-devel] [PATCH v7 4/4] avutil/frame: Fix direct pointer compare between different array

2025-02-11 Thread Zhao Zhili
From: Zhao Zhili 

---
 libavutil/frame.c | 12 
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/libavutil/frame.c b/libavutil/frame.c
index 992115e04f..492b467ebd 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -730,7 +730,7 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
 
 AVBufferRef *av_frame_get_plane_buffer(const AVFrame *frame, int plane)
 {
-uint8_t *data;
+uintptr_t data;
 int planes;
 
 if (frame->nb_samples) {
@@ -743,16 +743,20 @@ AVBufferRef *av_frame_get_plane_buffer(const AVFrame 
*frame, int plane)
 
 if (plane < 0 || plane >= planes || !frame->extended_data[plane])
 return NULL;
-data = frame->extended_data[plane];
+data = (uintptr_t)frame->extended_data[plane];
 
 for (int i = 0; i < FF_ARRAY_ELEMS(frame->buf) && frame->buf[i]; i++) {
 AVBufferRef *buf = frame->buf[i];
-if (data >= buf->data && data < buf->data + buf->size)
+uintptr_t buf_begin = (uintptr_t)buf->data;
+
+if (data >= buf_begin && data < buf_begin + buf->size)
 return buf;
 }
 for (int i = 0; i < frame->nb_extended_buf; i++) {
 AVBufferRef *buf = frame->extended_buf[i];
-if (data >= buf->data && data < buf->data + buf->size)
+uintptr_t buf_begin = (uintptr_t)buf->data;
+
+if (data >= buf_begin && data < buf_begin + buf->size)
 return buf;
 }
 return NULL;
-- 
2.46.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 v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread James Almer

On 2/11/2025 12:57 PM, Zhao Zhili wrote:




On Feb 11, 2025, at 23:37, Andreas Rheinhardt  
wrote:

Zhao Zhili:

From: Zhao Zhili 

Signed-off-by: Zhao Zhili 
---
libavcodec/hevc/hevcdec.c | 73 ++-
libavcodec/hevc/hevcdec.h |  2 ++
libavcodec/hevc/refs.c| 35 ++-
3 files changed, 108 insertions(+), 2 deletions(-)

diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
index e9c045f7a1..f71edf213b 100644
--- a/libavcodec/hevc/hevcdec.c
+++ b/libavcodec/hevc/hevcdec.c
@@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
}

+int ff_hevc_is_alpha_video(const HEVCContext *s)
+{
+const HEVCVPS *vps = s->vps;
+int ret = 0;
+
+if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
+return 0;
+
+/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId other
+ * than alpha cannot reach here.
+ */
+ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
+
+av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
+   ret ? "is" : "not");
+
+return ret;
+}
+
static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
{
 unsigned layers_active_output = 0, highest_layer;
@@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 s->layers_active_output = 1;
 s->layers_active_decode = 1;

+if (ff_hevc_is_alpha_video(s)) {
+const AVPixFmtDescriptor *desc = 
av_pix_fmt_desc_get(s->avctx->pix_fmt);
+
+if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
+return 0;
+
+s->layers_active_decode = (1 << vps->nb_layers) - 1;
+s->layers_active_output = 1;
+
+return 0;
+}
+
 // nothing requested - decode base layer only
 if (!s->nb_view_ids)
 return 0;
@@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
}

+static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
+  enum AVPixelFormat pix_fmt)
+{
+switch (pix_fmt) {
+case AV_PIX_FMT_YUV420P:
+case AV_PIX_FMT_YUVJ420P:
+return AV_PIX_FMT_YUVA420P;
+case AV_PIX_FMT_YUV420P10:
+return AV_PIX_FMT_YUVA420P10;
+case AV_PIX_FMT_YUV444P:
+return AV_PIX_FMT_YUVA444P;
+case AV_PIX_FMT_YUV422P:
+return AV_PIX_FMT_YUVA422P;
+case AV_PIX_FMT_YUV422P10LE:
+return AV_PIX_FMT_YUVA422P10LE;
+case AV_PIX_FMT_YUV444P10:
+return AV_PIX_FMT_YUVA444P10;
+case AV_PIX_FMT_YUV444P12:
+return AV_PIX_FMT_YUVA444P12;
+case AV_PIX_FMT_YUV422P12:
+return AV_PIX_FMT_YUVA422P12;
+default:
+av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for %s\n",
+   av_get_pix_fmt_name(pix_fmt));
+return AV_PIX_FMT_NONE;
+}
+}
+
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
{
#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
@@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
  CONFIG_HEVC_VDPAU_HWACCEL + \
  CONFIG_HEVC_VULKAN_HWACCEL)
-enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
+enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
+enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
 int ret;

+if (ff_hevc_is_alpha_video(s))
+alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
+
 switch (sps->pix_fmt) {
 case AV_PIX_FMT_YUV420P:
 case AV_PIX_FMT_YUVJ420P:
@@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
 break;
 }

+if (alpha_fmt != AV_PIX_FMT_NONE)
+*fmt++ = alpha_fmt;
 *fmt++ = sps->pix_fmt;
 *fmt = AV_PIX_FMT_NONE;

@@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
HEVCLayerContext *l,
 !sps->vui.common.video_signal_type_present_flag)
 pix_fmt = sps_base->pix_fmt;

+// Ignore range mismatch between base layer and alpha layer
+if (ff_hevc_is_alpha_video(s) &&
+sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
+pix_fmt == AV_PIX_FMT_YUVJ420P)
+pix_fmt = sps_base->pix_fmt;
+
 if (pix_fmt != sps_base->pix_fmt ||
 sps->width  != sps_base->width   ||
 sps->height != sps_base->height) {
diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
index 4e95035688..b2b725b5cd 100644
--- a/libavcodec/hevc/hevcdec.h
+++ b/libavcodec/hevc/hevcdec.h
@@ -714,6 +714,8 @@ void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, 
const HEVCPPS *pps,

void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int 
log2_cb_size);

+int ff_hevc_is_alpha_video(const HEVCContext *s);
+
extern const uint8_t ff_hevc

Re: [FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Zhao Zhili


> On Feb 11, 2025, at 23:37, Andreas Rheinhardt 
>  wrote:
> 
> Zhao Zhili:
>> From: Zhao Zhili 
>> 
>> Signed-off-by: Zhao Zhili 
>> ---
>> libavcodec/hevc/hevcdec.c | 73 ++-
>> libavcodec/hevc/hevcdec.h |  2 ++
>> libavcodec/hevc/refs.c| 35 ++-
>> 3 files changed, 108 insertions(+), 2 deletions(-)
>> 
>> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
>> index e9c045f7a1..f71edf213b 100644
>> --- a/libavcodec/hevc/hevcdec.c
>> +++ b/libavcodec/hevc/hevcdec.c
>> @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>> return 0;
>> }
>> 
>> +int ff_hevc_is_alpha_video(const HEVCContext *s)
>> +{
>> +const HEVCVPS *vps = s->vps;
>> +int ret = 0;
>> +
>> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
>> +return 0;
>> +
>> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
>> other
>> + * than alpha cannot reach here.
>> + */
>> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
>> +
>> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
>> +   ret ? "is" : "not");
>> +
>> +return ret;
>> +}
>> +
>> static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
>> {
>> unsigned layers_active_output = 0, highest_layer;
>> @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>> s->layers_active_output = 1;
>> s->layers_active_decode = 1;
>> 
>> +if (ff_hevc_is_alpha_video(s)) {
>> +const AVPixFmtDescriptor *desc = 
>> av_pix_fmt_desc_get(s->avctx->pix_fmt);
>> +
>> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
>> +return 0;
>> +
>> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
>> +s->layers_active_output = 1;
>> +
>> +return 0;
>> +}
>> +
>> // nothing requested - decode base layer only
>> if (!s->nb_view_ids)
>> return 0;
>> @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>> return 0;
>> }
>> 
>> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
>> +  enum AVPixelFormat pix_fmt)
>> +{
>> +switch (pix_fmt) {
>> +case AV_PIX_FMT_YUV420P:
>> +case AV_PIX_FMT_YUVJ420P:
>> +return AV_PIX_FMT_YUVA420P;
>> +case AV_PIX_FMT_YUV420P10:
>> +return AV_PIX_FMT_YUVA420P10;
>> +case AV_PIX_FMT_YUV444P:
>> +return AV_PIX_FMT_YUVA444P;
>> +case AV_PIX_FMT_YUV422P:
>> +return AV_PIX_FMT_YUVA422P;
>> +case AV_PIX_FMT_YUV422P10LE:
>> +return AV_PIX_FMT_YUVA422P10LE;
>> +case AV_PIX_FMT_YUV444P10:
>> +return AV_PIX_FMT_YUVA444P10;
>> +case AV_PIX_FMT_YUV444P12:
>> +return AV_PIX_FMT_YUVA444P12;
>> +case AV_PIX_FMT_YUV422P12:
>> +return AV_PIX_FMT_YUVA422P12;
>> +default:
>> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
>> %s\n",
>> +   av_get_pix_fmt_name(pix_fmt));
>> +return AV_PIX_FMT_NONE;
>> +}
>> +}
>> +
>> static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
>> {
>> #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
>> @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>> const HEVCSPS *sps)
>>  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
>>  CONFIG_HEVC_VDPAU_HWACCEL + \
>>  CONFIG_HEVC_VULKAN_HWACCEL)
>> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
>> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
>> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>> int ret;
>> 
>> +if (ff_hevc_is_alpha_video(s))
>> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
>> +
>> switch (sps->pix_fmt) {
>> case AV_PIX_FMT_YUV420P:
>> case AV_PIX_FMT_YUVJ420P:
>> @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>> const HEVCSPS *sps)
>> break;
>> }
>> 
>> +if (alpha_fmt != AV_PIX_FMT_NONE)
>> +*fmt++ = alpha_fmt;
>> *fmt++ = sps->pix_fmt;
>> *fmt = AV_PIX_FMT_NONE;
>> 
>> @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
>> HEVCLayerContext *l,
>> !sps->vui.common.video_signal_type_present_flag)
>> pix_fmt = sps_base->pix_fmt;
>> 
>> +// Ignore range mismatch between base layer and alpha layer
>> +if (ff_hevc_is_alpha_video(s) &&
>> +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
>> +pix_fmt == AV_PIX_FMT_YUVJ420P)
>> +pix_fmt = sps_base->pix_fmt;
>> +
>> if (pix_fmt != sps_base->pix_fmt ||
>> sps->width  != sps_base->width   ||
>> sps->height != sps_base->height) {
>> diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
>> i

Re: [FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Andreas Rheinhardt
Zhao Zhili:
> 
> 
>> On Feb 11, 2025, at 23:37, Andreas Rheinhardt 
>>  wrote:
>>
>> Zhao Zhili:
>>> From: Zhao Zhili 
>>>
>>> Signed-off-by: Zhao Zhili 
>>> ---
>>> libavcodec/hevc/hevcdec.c | 73 ++-
>>> libavcodec/hevc/hevcdec.h |  2 ++
>>> libavcodec/hevc/refs.c| 35 ++-
>>> 3 files changed, 108 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
>>> index e9c045f7a1..f71edf213b 100644
>>> --- a/libavcodec/hevc/hevcdec.c
>>> +++ b/libavcodec/hevc/hevcdec.c
>>> @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
>>> HEVCVPS *vps)
>>> return 0;
>>> }
>>>
>>> +int ff_hevc_is_alpha_video(const HEVCContext *s)
>>> +{
>>> +const HEVCVPS *vps = s->vps;
>>> +int ret = 0;
>>> +
>>> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
>>> +return 0;
>>> +
>>> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
>>> other
>>> + * than alpha cannot reach here.
>>> + */
>>> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
>>> +
>>> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
>>> +   ret ? "is" : "not");
>>> +
>>> +return ret;
>>> +}
>>> +
>>> static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
>>> {
>>> unsigned layers_active_output = 0, highest_layer;
>>> @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
>>> HEVCVPS *vps)
>>> s->layers_active_output = 1;
>>> s->layers_active_decode = 1;
>>>
>>> +if (ff_hevc_is_alpha_video(s)) {
>>> +const AVPixFmtDescriptor *desc = 
>>> av_pix_fmt_desc_get(s->avctx->pix_fmt);
>>> +
>>> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
>>> +return 0;
>>> +
>>> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
>>> +s->layers_active_output = 1;
>>> +
>>> +return 0;
>>> +}
>>> +
>>> // nothing requested - decode base layer only
>>> if (!s->nb_view_ids)
>>> return 0;
>>> @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
>>> HEVCVPS *vps)
>>> return 0;
>>> }
>>>
>>> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
>>> +  enum AVPixelFormat pix_fmt)
>>> +{
>>> +switch (pix_fmt) {
>>> +case AV_PIX_FMT_YUV420P:
>>> +case AV_PIX_FMT_YUVJ420P:
>>> +return AV_PIX_FMT_YUVA420P;
>>> +case AV_PIX_FMT_YUV420P10:
>>> +return AV_PIX_FMT_YUVA420P10;
>>> +case AV_PIX_FMT_YUV444P:
>>> +return AV_PIX_FMT_YUVA444P;
>>> +case AV_PIX_FMT_YUV422P:
>>> +return AV_PIX_FMT_YUVA422P;
>>> +case AV_PIX_FMT_YUV422P10LE:
>>> +return AV_PIX_FMT_YUVA422P10LE;
>>> +case AV_PIX_FMT_YUV444P10:
>>> +return AV_PIX_FMT_YUVA444P10;
>>> +case AV_PIX_FMT_YUV444P12:
>>> +return AV_PIX_FMT_YUVA444P12;
>>> +case AV_PIX_FMT_YUV422P12:
>>> +return AV_PIX_FMT_YUVA422P12;
>>> +default:
>>> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
>>> %s\n",
>>> +   av_get_pix_fmt_name(pix_fmt));
>>> +return AV_PIX_FMT_NONE;
>>> +}
>>> +}
>>> +
>>> static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
>>> {
>>> #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
>>> @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>>> const HEVCSPS *sps)
>>>  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
>>>  CONFIG_HEVC_VDPAU_HWACCEL + \
>>>  CONFIG_HEVC_VULKAN_HWACCEL)
>>> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
>>> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
>>> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>>> int ret;
>>>
>>> +if (ff_hevc_is_alpha_video(s))
>>> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
>>> +
>>> switch (sps->pix_fmt) {
>>> case AV_PIX_FMT_YUV420P:
>>> case AV_PIX_FMT_YUVJ420P:
>>> @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>>> const HEVCSPS *sps)
>>> break;
>>> }
>>>
>>> +if (alpha_fmt != AV_PIX_FMT_NONE)
>>> +*fmt++ = alpha_fmt;
>>> *fmt++ = sps->pix_fmt;
>>> *fmt = AV_PIX_FMT_NONE;
>>>
>>> @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
>>> HEVCLayerContext *l,
>>> !sps->vui.common.video_signal_type_present_flag)
>>> pix_fmt = sps_base->pix_fmt;
>>>
>>> +// Ignore range mismatch between base layer and alpha layer
>>> +if (ff_hevc_is_alpha_video(s) &&
>>> +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
>>> +pix_fmt == AV_PIX_FMT_YUVJ420P)
>>> +pix_fmt = sps_base->pix_fmt;
>>> +
>>> if (pix_fmt != sps_base->pix_fmt ||
>>> sps->width  != s

Re: [FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Zhao Zhili


> On Feb 12, 2025, at 00:02, James Almer  wrote:
> 
> On 2/11/2025 12:57 PM, Zhao Zhili wrote:
>>> On Feb 11, 2025, at 23:37, Andreas Rheinhardt 
>>>  wrote:
>>> 
>>> Zhao Zhili:
 From: Zhao Zhili 
 
 Signed-off-by: Zhao Zhili 
 ---
 libavcodec/hevc/hevcdec.c | 73 ++-
 libavcodec/hevc/hevcdec.h |  2 ++
 libavcodec/hevc/refs.c| 35 ++-
 3 files changed, 108 insertions(+), 2 deletions(-)
 
 diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
 index e9c045f7a1..f71edf213b 100644
 --- a/libavcodec/hevc/hevcdec.c
 +++ b/libavcodec/hevc/hevcdec.c
 @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
 HEVCVPS *vps)
 return 0;
 }
 
 +int ff_hevc_is_alpha_video(const HEVCContext *s)
 +{
 +const HEVCVPS *vps = s->vps;
 +int ret = 0;
 +
 +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
 +return 0;
 +
 +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
 other
 + * than alpha cannot reach here.
 + */
 +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
 +
 +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
 +   ret ? "is" : "not");
 +
 +return ret;
 +}
 +
 static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
 {
 unsigned layers_active_output = 0, highest_layer;
 @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
 HEVCVPS *vps)
 s->layers_active_output = 1;
 s->layers_active_decode = 1;
 
 +if (ff_hevc_is_alpha_video(s)) {
 +const AVPixFmtDescriptor *desc = 
 av_pix_fmt_desc_get(s->avctx->pix_fmt);
 +
 +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
 +return 0;
 +
 +s->layers_active_decode = (1 << vps->nb_layers) - 1;
 +s->layers_active_output = 1;
 +
 +return 0;
 +}
 +
 // nothing requested - decode base layer only
 if (!s->nb_view_ids)
 return 0;
 @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
 HEVCVPS *vps)
 return 0;
 }
 
 +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
 +  enum AVPixelFormat pix_fmt)
 +{
 +switch (pix_fmt) {
 +case AV_PIX_FMT_YUV420P:
 +case AV_PIX_FMT_YUVJ420P:
 +return AV_PIX_FMT_YUVA420P;
 +case AV_PIX_FMT_YUV420P10:
 +return AV_PIX_FMT_YUVA420P10;
 +case AV_PIX_FMT_YUV444P:
 +return AV_PIX_FMT_YUVA444P;
 +case AV_PIX_FMT_YUV422P:
 +return AV_PIX_FMT_YUVA422P;
 +case AV_PIX_FMT_YUV422P10LE:
 +return AV_PIX_FMT_YUVA422P10LE;
 +case AV_PIX_FMT_YUV444P10:
 +return AV_PIX_FMT_YUVA444P10;
 +case AV_PIX_FMT_YUV444P12:
 +return AV_PIX_FMT_YUVA444P12;
 +case AV_PIX_FMT_YUV422P12:
 +return AV_PIX_FMT_YUVA422P12;
 +default:
 +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
 %s\n",
 +   av_get_pix_fmt_name(pix_fmt));
 +return AV_PIX_FMT_NONE;
 +}
 +}
 +
 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
 {
 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
 @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
 const HEVCSPS *sps)
  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
  CONFIG_HEVC_VDPAU_HWACCEL + \
  CONFIG_HEVC_VULKAN_HWACCEL)
 -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
 +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
 +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
 int ret;
 
 +if (ff_hevc_is_alpha_video(s))
 +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
 +
 switch (sps->pix_fmt) {
 case AV_PIX_FMT_YUV420P:
 case AV_PIX_FMT_YUVJ420P:
 @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
 const HEVCSPS *sps)
 break;
 }
 
 +if (alpha_fmt != AV_PIX_FMT_NONE)
 +*fmt++ = alpha_fmt;
 *fmt++ = sps->pix_fmt;
 *fmt = AV_PIX_FMT_NONE;
 
 @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
 HEVCLayerContext *l,
 !sps->vui.common.video_signal_type_present_flag)
 pix_fmt = sps_base->pix_fmt;
 
 +// Ignore range mismatch between base layer and alpha layer
 +if (ff_hevc_is_alpha_video(s) &&
 +sps_base->pix_fmt 

Re: [FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread James Almer

On 2/11/2025 1:11 PM, Zhao Zhili wrote:




On Feb 12, 2025, at 00:02, James Almer  wrote:

On 2/11/2025 12:57 PM, Zhao Zhili wrote:

On Feb 11, 2025, at 23:37, Andreas Rheinhardt  
wrote:

Zhao Zhili:

From: Zhao Zhili 

Signed-off-by: Zhao Zhili 
---
libavcodec/hevc/hevcdec.c | 73 ++-
libavcodec/hevc/hevcdec.h |  2 ++
libavcodec/hevc/refs.c| 35 ++-
3 files changed, 108 insertions(+), 2 deletions(-)

diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
index e9c045f7a1..f71edf213b 100644
--- a/libavcodec/hevc/hevcdec.c
+++ b/libavcodec/hevc/hevcdec.c
@@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
}

+int ff_hevc_is_alpha_video(const HEVCContext *s)
+{
+const HEVCVPS *vps = s->vps;
+int ret = 0;
+
+if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
+return 0;
+
+/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId other
+ * than alpha cannot reach here.
+ */
+ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
+
+av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
+   ret ? "is" : "not");
+
+return ret;
+}
+
static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
{
 unsigned layers_active_output = 0, highest_layer;
@@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 s->layers_active_output = 1;
 s->layers_active_decode = 1;

+if (ff_hevc_is_alpha_video(s)) {
+const AVPixFmtDescriptor *desc = 
av_pix_fmt_desc_get(s->avctx->pix_fmt);
+
+if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
+return 0;
+
+s->layers_active_decode = (1 << vps->nb_layers) - 1;
+s->layers_active_output = 1;
+
+return 0;
+}
+
 // nothing requested - decode base layer only
 if (!s->nb_view_ids)
 return 0;
@@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
}

+static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
+  enum AVPixelFormat pix_fmt)
+{
+switch (pix_fmt) {
+case AV_PIX_FMT_YUV420P:
+case AV_PIX_FMT_YUVJ420P:
+return AV_PIX_FMT_YUVA420P;
+case AV_PIX_FMT_YUV420P10:
+return AV_PIX_FMT_YUVA420P10;
+case AV_PIX_FMT_YUV444P:
+return AV_PIX_FMT_YUVA444P;
+case AV_PIX_FMT_YUV422P:
+return AV_PIX_FMT_YUVA422P;
+case AV_PIX_FMT_YUV422P10LE:
+return AV_PIX_FMT_YUVA422P10LE;
+case AV_PIX_FMT_YUV444P10:
+return AV_PIX_FMT_YUVA444P10;
+case AV_PIX_FMT_YUV444P12:
+return AV_PIX_FMT_YUVA444P12;
+case AV_PIX_FMT_YUV422P12:
+return AV_PIX_FMT_YUVA422P12;
+default:
+av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for %s\n",
+   av_get_pix_fmt_name(pix_fmt));
+return AV_PIX_FMT_NONE;
+}
+}
+
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
{
#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
@@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
  CONFIG_HEVC_VDPAU_HWACCEL + \
  CONFIG_HEVC_VULKAN_HWACCEL)
-enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
+enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
+enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
 int ret;

+if (ff_hevc_is_alpha_video(s))
+alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
+
 switch (sps->pix_fmt) {
 case AV_PIX_FMT_YUV420P:
 case AV_PIX_FMT_YUVJ420P:
@@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
 break;
 }

+if (alpha_fmt != AV_PIX_FMT_NONE)
+*fmt++ = alpha_fmt;
 *fmt++ = sps->pix_fmt;
 *fmt = AV_PIX_FMT_NONE;

@@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
HEVCLayerContext *l,
 !sps->vui.common.video_signal_type_present_flag)
 pix_fmt = sps_base->pix_fmt;

+// Ignore range mismatch between base layer and alpha layer
+if (ff_hevc_is_alpha_video(s) &&
+sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
+pix_fmt == AV_PIX_FMT_YUVJ420P)
+pix_fmt = sps_base->pix_fmt;
+
 if (pix_fmt != sps_base->pix_fmt ||
 sps->width  != sps_base->width   ||
 sps->height != sps_base->height) {
diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
index 4e95035688..b2b725b5cd 100644
--- a/libavcodec/hevc/hevcdec.h
+++ b/libavcodec/hevc/hevcdec.h
@@ -714,6 +714,8 @@ void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, 
const HEVCPPS *pps,

void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int 
log2_cb_

Re: [FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Zhao Zhili


> On Feb 12, 2025, at 00:10, Andreas Rheinhardt 
>  wrote:
> 
> Zhao Zhili:
>> 
>> 
>>> On Feb 11, 2025, at 23:37, Andreas Rheinhardt 
>>>  wrote:
>>> 
>>> Zhao Zhili:
 From: Zhao Zhili 
 
 Signed-off-by: Zhao Zhili 
 ---
 libavcodec/hevc/hevcdec.c | 73 ++-
 libavcodec/hevc/hevcdec.h |  2 ++
 libavcodec/hevc/refs.c| 35 ++-
 3 files changed, 108 insertions(+), 2 deletions(-)
 
 diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
 index e9c045f7a1..f71edf213b 100644
 --- a/libavcodec/hevc/hevcdec.c
 +++ b/libavcodec/hevc/hevcdec.c
 @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
 HEVCVPS *vps)
return 0;
 }
 
 +int ff_hevc_is_alpha_video(const HEVCContext *s)
 +{
 +const HEVCVPS *vps = s->vps;
 +int ret = 0;
 +
 +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
 +return 0;
 +
 +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
 other
 + * than alpha cannot reach here.
 + */
 +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
 +
 +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
 +   ret ? "is" : "not");
 +
 +return ret;
 +}
 +
 static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
 {
unsigned layers_active_output = 0, highest_layer;
 @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
 HEVCVPS *vps)
s->layers_active_output = 1;
s->layers_active_decode = 1;
 
 +if (ff_hevc_is_alpha_video(s)) {
 +const AVPixFmtDescriptor *desc = 
 av_pix_fmt_desc_get(s->avctx->pix_fmt);
 +
 +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
 +return 0;
 +
 +s->layers_active_decode = (1 << vps->nb_layers) - 1;
 +s->layers_active_output = 1;
 +
 +return 0;
 +}
 +
// nothing requested - decode base layer only
if (!s->nb_view_ids)
return 0;
 @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
 HEVCVPS *vps)
return 0;
 }
 
 +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
 +  enum AVPixelFormat pix_fmt)
 +{
 +switch (pix_fmt) {
 +case AV_PIX_FMT_YUV420P:
 +case AV_PIX_FMT_YUVJ420P:
 +return AV_PIX_FMT_YUVA420P;
 +case AV_PIX_FMT_YUV420P10:
 +return AV_PIX_FMT_YUVA420P10;
 +case AV_PIX_FMT_YUV444P:
 +return AV_PIX_FMT_YUVA444P;
 +case AV_PIX_FMT_YUV422P:
 +return AV_PIX_FMT_YUVA422P;
 +case AV_PIX_FMT_YUV422P10LE:
 +return AV_PIX_FMT_YUVA422P10LE;
 +case AV_PIX_FMT_YUV444P10:
 +return AV_PIX_FMT_YUVA444P10;
 +case AV_PIX_FMT_YUV444P12:
 +return AV_PIX_FMT_YUVA444P12;
 +case AV_PIX_FMT_YUV422P12:
 +return AV_PIX_FMT_YUVA422P12;
 +default:
 +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
 %s\n",
 +   av_get_pix_fmt_name(pix_fmt));
 +return AV_PIX_FMT_NONE;
 +}
 +}
 +
 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
 {
 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
 @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
 const HEVCSPS *sps)
 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
 CONFIG_HEVC_VDPAU_HWACCEL + \
 CONFIG_HEVC_VULKAN_HWACCEL)
 -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
 +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
 +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
int ret;
 
 +if (ff_hevc_is_alpha_video(s))
 +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
 +
switch (sps->pix_fmt) {
case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUVJ420P:
 @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
 const HEVCSPS *sps)
break;
}
 
 +if (alpha_fmt != AV_PIX_FMT_NONE)
 +*fmt++ = alpha_fmt;
*fmt++ = sps->pix_fmt;
*fmt = AV_PIX_FMT_NONE;
 
 @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
 HEVCLayerContext *l,
!sps->vui.common.video_signal_type_present_flag)
pix_fmt = sps_base->pix_fmt;
 
 +// Ignore range mismatch between base layer and alpha layer
 +if (ff_hevc_is_alpha_video(s) &&
 +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
 + 

Re: [FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread James Almer

On 2/11/2025 1:10 PM, Andreas Rheinhardt wrote:

Zhao Zhili:




On Feb 11, 2025, at 23:37, Andreas Rheinhardt  
wrote:

Zhao Zhili:

From: Zhao Zhili 

Signed-off-by: Zhao Zhili 
---
libavcodec/hevc/hevcdec.c | 73 ++-
libavcodec/hevc/hevcdec.h |  2 ++
libavcodec/hevc/refs.c| 35 ++-
3 files changed, 108 insertions(+), 2 deletions(-)

diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
index e9c045f7a1..f71edf213b 100644
--- a/libavcodec/hevc/hevcdec.c
+++ b/libavcodec/hevc/hevcdec.c
@@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
}

+int ff_hevc_is_alpha_video(const HEVCContext *s)
+{
+const HEVCVPS *vps = s->vps;
+int ret = 0;
+
+if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
+return 0;
+
+/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId other
+ * than alpha cannot reach here.
+ */
+ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
+
+av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
+   ret ? "is" : "not");
+
+return ret;
+}
+
static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
{
 unsigned layers_active_output = 0, highest_layer;
@@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 s->layers_active_output = 1;
 s->layers_active_decode = 1;

+if (ff_hevc_is_alpha_video(s)) {
+const AVPixFmtDescriptor *desc = 
av_pix_fmt_desc_get(s->avctx->pix_fmt);
+
+if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
+return 0;
+
+s->layers_active_decode = (1 << vps->nb_layers) - 1;
+s->layers_active_output = 1;
+
+return 0;
+}
+
 // nothing requested - decode base layer only
 if (!s->nb_view_ids)
 return 0;
@@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
}

+static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
+  enum AVPixelFormat pix_fmt)
+{
+switch (pix_fmt) {
+case AV_PIX_FMT_YUV420P:
+case AV_PIX_FMT_YUVJ420P:
+return AV_PIX_FMT_YUVA420P;
+case AV_PIX_FMT_YUV420P10:
+return AV_PIX_FMT_YUVA420P10;
+case AV_PIX_FMT_YUV444P:
+return AV_PIX_FMT_YUVA444P;
+case AV_PIX_FMT_YUV422P:
+return AV_PIX_FMT_YUVA422P;
+case AV_PIX_FMT_YUV422P10LE:
+return AV_PIX_FMT_YUVA422P10LE;
+case AV_PIX_FMT_YUV444P10:
+return AV_PIX_FMT_YUVA444P10;
+case AV_PIX_FMT_YUV444P12:
+return AV_PIX_FMT_YUVA444P12;
+case AV_PIX_FMT_YUV422P12:
+return AV_PIX_FMT_YUVA422P12;
+default:
+av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for %s\n",
+   av_get_pix_fmt_name(pix_fmt));
+return AV_PIX_FMT_NONE;
+}
+}
+
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
{
#define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
@@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
  CONFIG_HEVC_VDPAU_HWACCEL + \
  CONFIG_HEVC_VULKAN_HWACCEL)
-enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
+enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
+enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
 int ret;

+if (ff_hevc_is_alpha_video(s))
+alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
+
 switch (sps->pix_fmt) {
 case AV_PIX_FMT_YUV420P:
 case AV_PIX_FMT_YUVJ420P:
@@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
 break;
 }

+if (alpha_fmt != AV_PIX_FMT_NONE)
+*fmt++ = alpha_fmt;
 *fmt++ = sps->pix_fmt;
 *fmt = AV_PIX_FMT_NONE;

@@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
HEVCLayerContext *l,
 !sps->vui.common.video_signal_type_present_flag)
 pix_fmt = sps_base->pix_fmt;

+// Ignore range mismatch between base layer and alpha layer
+if (ff_hevc_is_alpha_video(s) &&
+sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
+pix_fmt == AV_PIX_FMT_YUVJ420P)
+pix_fmt = sps_base->pix_fmt;
+
 if (pix_fmt != sps_base->pix_fmt ||
 sps->width  != sps_base->width   ||
 sps->height != sps_base->height) {
diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
index 4e95035688..b2b725b5cd 100644
--- a/libavcodec/hevc/hevcdec.h
+++ b/libavcodec/hevc/hevcdec.h
@@ -714,6 +714,8 @@ void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, 
const HEVCPPS *pps,

void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int 
log2_cb_size);

+int ff_hevc_is_alpha_video(const HEVCContext *s);
+
extern c

Re: [FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Andreas Rheinhardt
Zhao Zhili:
> 
> 
>> On Feb 12, 2025, at 00:10, Andreas Rheinhardt 
>>  wrote:
>>
>> Zhao Zhili:
>>>
>>>
 On Feb 11, 2025, at 23:37, Andreas Rheinhardt 
  wrote:

 Zhao Zhili:
> From: Zhao Zhili 
>
> Signed-off-by: Zhao Zhili 
> ---
> libavcodec/hevc/hevcdec.c | 73 ++-
> libavcodec/hevc/hevcdec.h |  2 ++
> libavcodec/hevc/refs.c| 35 ++-
> 3 files changed, 108 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
> index e9c045f7a1..f71edf213b 100644
> --- a/libavcodec/hevc/hevcdec.c
> +++ b/libavcodec/hevc/hevcdec.c
> @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>return 0;
> }
>
> +int ff_hevc_is_alpha_video(const HEVCContext *s)
> +{
> +const HEVCVPS *vps = s->vps;
> +int ret = 0;
> +
> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
> +return 0;
> +
> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
> other
> + * than alpha cannot reach here.
> + */
> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
> +
> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
> +   ret ? "is" : "not");
> +
> +return ret;
> +}
> +
> static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
> {
>unsigned layers_active_output = 0, highest_layer;
> @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>s->layers_active_output = 1;
>s->layers_active_decode = 1;
>
> +if (ff_hevc_is_alpha_video(s)) {
> +const AVPixFmtDescriptor *desc = 
> av_pix_fmt_desc_get(s->avctx->pix_fmt);
> +
> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
> +return 0;
> +
> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
> +s->layers_active_output = 1;
> +
> +return 0;
> +}
> +
>// nothing requested - decode base layer only
>if (!s->nb_view_ids)
>return 0;
> @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>return 0;
> }
>
> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
> +  enum AVPixelFormat pix_fmt)
> +{
> +switch (pix_fmt) {
> +case AV_PIX_FMT_YUV420P:
> +case AV_PIX_FMT_YUVJ420P:
> +return AV_PIX_FMT_YUVA420P;
> +case AV_PIX_FMT_YUV420P10:
> +return AV_PIX_FMT_YUVA420P10;
> +case AV_PIX_FMT_YUV444P:
> +return AV_PIX_FMT_YUVA444P;
> +case AV_PIX_FMT_YUV422P:
> +return AV_PIX_FMT_YUVA422P;
> +case AV_PIX_FMT_YUV422P10LE:
> +return AV_PIX_FMT_YUVA422P10LE;
> +case AV_PIX_FMT_YUV444P10:
> +return AV_PIX_FMT_YUVA444P10;
> +case AV_PIX_FMT_YUV444P12:
> +return AV_PIX_FMT_YUVA444P12;
> +case AV_PIX_FMT_YUV422P12:
> +return AV_PIX_FMT_YUVA422P12;
> +default:
> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
> %s\n",
> +   av_get_pix_fmt_name(pix_fmt));
> +return AV_PIX_FMT_NONE;
> +}
> +}
> +
> static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
> {
> #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
> @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
> CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
> CONFIG_HEVC_VDPAU_HWACCEL + \
> CONFIG_HEVC_VULKAN_HWACCEL)
> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>int ret;
>
> +if (ff_hevc_is_alpha_video(s))
> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
> +
>switch (sps->pix_fmt) {
>case AV_PIX_FMT_YUV420P:
>case AV_PIX_FMT_YUVJ420P:
> @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
>break;
>}
>
> +if (alpha_fmt != AV_PIX_FMT_NONE)
> +*fmt++ = alpha_fmt;
>*fmt++ = sps->pix_fmt;
>*fmt = AV_PIX_FMT_NONE;
>
> @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
> HEVCLayerContext *l,
>!sps->vui.common.video_signal_type_present_flag)
>pix_fmt = sps_base->pix_fmt;
>
> +// Ignore range mismatch between base l

Re: [FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Zhao Zhili


> On Feb 12, 2025, at 00:25, Andreas Rheinhardt 
>  wrote:
> 
> Zhao Zhili:
>> 
>> 
>>> On Feb 12, 2025, at 00:10, Andreas Rheinhardt 
>>>  wrote:
>>> 
>>> Zhao Zhili:
 
 
> On Feb 11, 2025, at 23:37, Andreas Rheinhardt 
>  wrote:
> 
> Zhao Zhili:
>> From: Zhao Zhili 
>> 
>> Signed-off-by: Zhao Zhili 
>> ---
>> libavcodec/hevc/hevcdec.c | 73 ++-
>> libavcodec/hevc/hevcdec.h |  2 ++
>> libavcodec/hevc/refs.c| 35 ++-
>> 3 files changed, 108 insertions(+), 2 deletions(-)
>> 
>> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
>> index e9c045f7a1..f71edf213b 100644
>> --- a/libavcodec/hevc/hevcdec.c
>> +++ b/libavcodec/hevc/hevcdec.c
>> @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>>   return 0;
>> }
>> 
>> +int ff_hevc_is_alpha_video(const HEVCContext *s)
>> +{
>> +const HEVCVPS *vps = s->vps;
>> +int ret = 0;
>> +
>> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
>> +return 0;
>> +
>> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with 
>> AuxId other
>> + * than alpha cannot reach here.
>> + */
>> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
>> +
>> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha 
>> video\n",
>> +   ret ? "is" : "not");
>> +
>> +return ret;
>> +}
>> +
>> static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
>> {
>>   unsigned layers_active_output = 0, highest_layer;
>> @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>>   s->layers_active_output = 1;
>>   s->layers_active_decode = 1;
>> 
>> +if (ff_hevc_is_alpha_video(s)) {
>> +const AVPixFmtDescriptor *desc = 
>> av_pix_fmt_desc_get(s->avctx->pix_fmt);
>> +
>> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
>> +return 0;
>> +
>> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
>> +s->layers_active_output = 1;
>> +
>> +return 0;
>> +}
>> +
>>   // nothing requested - decode base layer only
>>   if (!s->nb_view_ids)
>>   return 0;
>> @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>>   return 0;
>> }
>> 
>> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
>> +  enum AVPixelFormat 
>> pix_fmt)
>> +{
>> +switch (pix_fmt) {
>> +case AV_PIX_FMT_YUV420P:
>> +case AV_PIX_FMT_YUVJ420P:
>> +return AV_PIX_FMT_YUVA420P;
>> +case AV_PIX_FMT_YUV420P10:
>> +return AV_PIX_FMT_YUVA420P10;
>> +case AV_PIX_FMT_YUV444P:
>> +return AV_PIX_FMT_YUVA444P;
>> +case AV_PIX_FMT_YUV422P:
>> +return AV_PIX_FMT_YUVA422P;
>> +case AV_PIX_FMT_YUV422P10LE:
>> +return AV_PIX_FMT_YUVA422P10LE;
>> +case AV_PIX_FMT_YUV444P10:
>> +return AV_PIX_FMT_YUVA444P10;
>> +case AV_PIX_FMT_YUV444P12:
>> +return AV_PIX_FMT_YUVA444P12;
>> +case AV_PIX_FMT_YUV422P12:
>> +return AV_PIX_FMT_YUVA422P12;
>> +default:
>> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
>> %s\n",
>> +   av_get_pix_fmt_name(pix_fmt));
>> +return AV_PIX_FMT_NONE;
>> +}
>> +}
>> +
>> static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
>> {
>> #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
>> @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext 
>> *s, const HEVCSPS *sps)
>>CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
>>CONFIG_HEVC_VDPAU_HWACCEL + \
>>CONFIG_HEVC_VULKAN_HWACCEL)
>> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
>> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
>> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>>   int ret;
>> 
>> +if (ff_hevc_is_alpha_video(s))
>> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
>> +
>>   switch (sps->pix_fmt) {
>>   case AV_PIX_FMT_YUV420P:
>>   case AV_PIX_FMT_YUVJ420P:
>> @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>> const HEVCSPS *sps)
>>   break;
>>   }
>> 
>> +if (alpha_fmt != AV_PIX_FMT_NONE)
>> +*fmt++ = alpha_fmt;
>>   *fmt++ = sps->pix_fmt;
>>   *fmt = AV_PIX_FMT_NONE;
>> 
>> @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s,

Re: [FFmpeg-devel] [PATCH v6 3/3] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Andreas Rheinhardt
Zhao Zhili:
> From: Zhao Zhili 
> 
> Signed-off-by: Zhao Zhili 
> ---
>  libavcodec/hevc/hevcdec.c | 73 ++-
>  libavcodec/hevc/hevcdec.h |  2 ++
>  libavcodec/hevc/refs.c| 34 +-
>  3 files changed, 107 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
> index e9c045f7a1..f71edf213b 100644
> --- a/libavcodec/hevc/hevcdec.c
> +++ b/libavcodec/hevc/hevcdec.c
> @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>  return 0;
>  }
>  
> +int ff_hevc_is_alpha_video(const HEVCContext *s)
> +{
> +const HEVCVPS *vps = s->vps;
> +int ret = 0;
> +
> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
> +return 0;
> +
> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
> other
> + * than alpha cannot reach here.
> + */
> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
> +
> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
> +   ret ? "is" : "not");
> +
> +return ret;
> +}
> +
>  static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
>  {
>  unsigned layers_active_output = 0, highest_layer;
> @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>  s->layers_active_output = 1;
>  s->layers_active_decode = 1;
>  
> +if (ff_hevc_is_alpha_video(s)) {
> +const AVPixFmtDescriptor *desc = 
> av_pix_fmt_desc_get(s->avctx->pix_fmt);
> +
> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
> +return 0;
> +
> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
> +s->layers_active_output = 1;
> +
> +return 0;
> +}
> +
>  // nothing requested - decode base layer only
>  if (!s->nb_view_ids)
>  return 0;
> @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>  return 0;
>  }
>  
> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
> +  enum AVPixelFormat pix_fmt)
> +{
> +switch (pix_fmt) {
> +case AV_PIX_FMT_YUV420P:
> +case AV_PIX_FMT_YUVJ420P:
> +return AV_PIX_FMT_YUVA420P;
> +case AV_PIX_FMT_YUV420P10:
> +return AV_PIX_FMT_YUVA420P10;
> +case AV_PIX_FMT_YUV444P:
> +return AV_PIX_FMT_YUVA444P;
> +case AV_PIX_FMT_YUV422P:
> +return AV_PIX_FMT_YUVA422P;
> +case AV_PIX_FMT_YUV422P10LE:
> +return AV_PIX_FMT_YUVA422P10LE;
> +case AV_PIX_FMT_YUV444P10:
> +return AV_PIX_FMT_YUVA444P10;
> +case AV_PIX_FMT_YUV444P12:
> +return AV_PIX_FMT_YUVA444P12;
> +case AV_PIX_FMT_YUV422P12:
> +return AV_PIX_FMT_YUVA422P12;
> +default:
> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
> %s\n",
> +   av_get_pix_fmt_name(pix_fmt));
> +return AV_PIX_FMT_NONE;
> +}
> +}
> +
>  static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
>  {
>  #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
> @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
>   CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
>   CONFIG_HEVC_VDPAU_HWACCEL + \
>   CONFIG_HEVC_VULKAN_HWACCEL)
> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>  int ret;
>  
> +if (ff_hevc_is_alpha_video(s))
> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
> +
>  switch (sps->pix_fmt) {
>  case AV_PIX_FMT_YUV420P:
>  case AV_PIX_FMT_YUVJ420P:
> @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
>  break;
>  }
>  
> +if (alpha_fmt != AV_PIX_FMT_NONE)
> +*fmt++ = alpha_fmt;
>  *fmt++ = sps->pix_fmt;
>  *fmt = AV_PIX_FMT_NONE;
>  
> @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
> HEVCLayerContext *l,
>  !sps->vui.common.video_signal_type_present_flag)
>  pix_fmt = sps_base->pix_fmt;
>  
> +// Ignore range mismatch between base layer and alpha layer
> +if (ff_hevc_is_alpha_video(s) &&
> +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
> +pix_fmt == AV_PIX_FMT_YUVJ420P)
> +pix_fmt = sps_base->pix_fmt;
> +
>  if (pix_fmt != sps_base->pix_fmt ||
>  sps->width  != sps_base->width   ||
>  sps->height != sps_base->height) {
> diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
> index 4e95035688..b2b725b5cd 100644
> --- a/libavcodec/hevc/hevcdec.h
> +++ b/libavcodec/hevc/hevcdec.h
> @@ -714,6 +714,8 @@ void ff_hevc_hls_residual_coding(HEVCLoca

Re: [FFmpeg-devel] [PATCH v6 3/3] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Andreas Rheinhardt
Zhao Zhili:
> 
> 
>> On Feb 11, 2025, at 19:23, Andreas Rheinhardt 
>>  wrote:
>>
>> Zhao Zhili:
>>> From: Zhao Zhili 
>>>
>>> Signed-off-by: Zhao Zhili 
>>> ---
>>> libavcodec/hevc/hevcdec.c | 73 ++-
>>> libavcodec/hevc/hevcdec.h |  2 ++
>>> libavcodec/hevc/refs.c| 34 +-
>>> 3 files changed, 107 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
>>> index e9c045f7a1..f71edf213b 100644
>>> --- a/libavcodec/hevc/hevcdec.c
>>> +++ b/libavcodec/hevc/hevcdec.c
>>> @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
>>> HEVCVPS *vps)
>>> return 0;
>>> }
>>>
>>> +int ff_hevc_is_alpha_video(const HEVCContext *s)
>>> +{
>>> +const HEVCVPS *vps = s->vps;
>>> +int ret = 0;
>>> +
>>> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
>>> +return 0;
>>> +
>>> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
>>> other
>>> + * than alpha cannot reach here.
>>> + */
>>> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
>>> +
>>> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
>>> +   ret ? "is" : "not");
>>> +
>>> +return ret;
>>> +}
>>> +
>>> static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
>>> {
>>> unsigned layers_active_output = 0, highest_layer;
>>> @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
>>> HEVCVPS *vps)
>>> s->layers_active_output = 1;
>>> s->layers_active_decode = 1;
>>>
>>> +if (ff_hevc_is_alpha_video(s)) {
>>> +const AVPixFmtDescriptor *desc = 
>>> av_pix_fmt_desc_get(s->avctx->pix_fmt);
>>> +
>>> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
>>> +return 0;
>>> +
>>> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
>>> +s->layers_active_output = 1;
>>> +
>>> +return 0;
>>> +}
>>> +
>>> // nothing requested - decode base layer only
>>> if (!s->nb_view_ids)
>>> return 0;
>>> @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
>>> HEVCVPS *vps)
>>> return 0;
>>> }
>>>
>>> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
>>> +  enum AVPixelFormat pix_fmt)
>>> +{
>>> +switch (pix_fmt) {
>>> +case AV_PIX_FMT_YUV420P:
>>> +case AV_PIX_FMT_YUVJ420P:
>>> +return AV_PIX_FMT_YUVA420P;
>>> +case AV_PIX_FMT_YUV420P10:
>>> +return AV_PIX_FMT_YUVA420P10;
>>> +case AV_PIX_FMT_YUV444P:
>>> +return AV_PIX_FMT_YUVA444P;
>>> +case AV_PIX_FMT_YUV422P:
>>> +return AV_PIX_FMT_YUVA422P;
>>> +case AV_PIX_FMT_YUV422P10LE:
>>> +return AV_PIX_FMT_YUVA422P10LE;
>>> +case AV_PIX_FMT_YUV444P10:
>>> +return AV_PIX_FMT_YUVA444P10;
>>> +case AV_PIX_FMT_YUV444P12:
>>> +return AV_PIX_FMT_YUVA444P12;
>>> +case AV_PIX_FMT_YUV422P12:
>>> +return AV_PIX_FMT_YUVA422P12;
>>> +default:
>>> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
>>> %s\n",
>>> +   av_get_pix_fmt_name(pix_fmt));
>>> +return AV_PIX_FMT_NONE;
>>> +}
>>> +}
>>> +
>>> static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
>>> {
>>> #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
>>> @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>>> const HEVCSPS *sps)
>>>  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
>>>  CONFIG_HEVC_VDPAU_HWACCEL + \
>>>  CONFIG_HEVC_VULKAN_HWACCEL)
>>> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
>>> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
>>> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>>> int ret;
>>>
>>> +if (ff_hevc_is_alpha_video(s))
>>> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
>>> +
>>> switch (sps->pix_fmt) {
>>> case AV_PIX_FMT_YUV420P:
>>> case AV_PIX_FMT_YUVJ420P:
>>> @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>>> const HEVCSPS *sps)
>>> break;
>>> }
>>>
>>> +if (alpha_fmt != AV_PIX_FMT_NONE)
>>> +*fmt++ = alpha_fmt;
>>> *fmt++ = sps->pix_fmt;
>>> *fmt = AV_PIX_FMT_NONE;
>>>
>>> @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
>>> HEVCLayerContext *l,
>>> !sps->vui.common.video_signal_type_present_flag)
>>> pix_fmt = sps_base->pix_fmt;
>>>
>>> +// Ignore range mismatch between base layer and alpha layer
>>> +if (ff_hevc_is_alpha_video(s) &&
>>> +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
>>> +pix_fmt == AV_PIX_FMT_YUVJ420P)
>>> +pix_fmt = sps_base->pix_fmt;
>>> +
>>> if (pix_fmt != sps_base->pix_fmt ||
>>> sps->width  != sp

Re: [FFmpeg-devel] [PATCH v6 3/3] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Andreas Rheinhardt
Zhao Zhili:
> 
> 
>> On Feb 11, 2025, at 20:12, Andreas Rheinhardt 
>>  wrote:
>>
>> Zhao Zhili:
>>>
>>>
 On Feb 11, 2025, at 19:23, Andreas Rheinhardt 
  wrote:

 Zhao Zhili:
> From: Zhao Zhili 
>
> Signed-off-by: Zhao Zhili 
> ---
> libavcodec/hevc/hevcdec.c | 73 ++-
> libavcodec/hevc/hevcdec.h |  2 ++
> libavcodec/hevc/refs.c| 34 +-
> 3 files changed, 107 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
> index e9c045f7a1..f71edf213b 100644
> --- a/libavcodec/hevc/hevcdec.c
> +++ b/libavcodec/hevc/hevcdec.c
> @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>return 0;
> }
>
> +int ff_hevc_is_alpha_video(const HEVCContext *s)
> +{
> +const HEVCVPS *vps = s->vps;
> +int ret = 0;
> +
> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
> +return 0;
> +
> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
> other
> + * than alpha cannot reach here.
> + */
> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
> +
> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
> +   ret ? "is" : "not");
> +
> +return ret;
> +}
> +
> static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
> {
>unsigned layers_active_output = 0, highest_layer;
> @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>s->layers_active_output = 1;
>s->layers_active_decode = 1;
>
> +if (ff_hevc_is_alpha_video(s)) {
> +const AVPixFmtDescriptor *desc = 
> av_pix_fmt_desc_get(s->avctx->pix_fmt);
> +
> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
> +return 0;
> +
> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
> +s->layers_active_output = 1;
> +
> +return 0;
> +}
> +
>// nothing requested - decode base layer only
>if (!s->nb_view_ids)
>return 0;
> @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>return 0;
> }
>
> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
> +  enum AVPixelFormat pix_fmt)
> +{
> +switch (pix_fmt) {
> +case AV_PIX_FMT_YUV420P:
> +case AV_PIX_FMT_YUVJ420P:
> +return AV_PIX_FMT_YUVA420P;
> +case AV_PIX_FMT_YUV420P10:
> +return AV_PIX_FMT_YUVA420P10;
> +case AV_PIX_FMT_YUV444P:
> +return AV_PIX_FMT_YUVA444P;
> +case AV_PIX_FMT_YUV422P:
> +return AV_PIX_FMT_YUVA422P;
> +case AV_PIX_FMT_YUV422P10LE:
> +return AV_PIX_FMT_YUVA422P10LE;
> +case AV_PIX_FMT_YUV444P10:
> +return AV_PIX_FMT_YUVA444P10;
> +case AV_PIX_FMT_YUV444P12:
> +return AV_PIX_FMT_YUVA444P12;
> +case AV_PIX_FMT_YUV422P12:
> +return AV_PIX_FMT_YUVA422P12;
> +default:
> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
> %s\n",
> +   av_get_pix_fmt_name(pix_fmt));
> +return AV_PIX_FMT_NONE;
> +}
> +}
> +
> static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
> {
> #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
> @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
> CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
> CONFIG_HEVC_VDPAU_HWACCEL + \
> CONFIG_HEVC_VULKAN_HWACCEL)
> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>int ret;
>
> +if (ff_hevc_is_alpha_video(s))
> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
> +
>switch (sps->pix_fmt) {
>case AV_PIX_FMT_YUV420P:
>case AV_PIX_FMT_YUVJ420P:
> @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
>break;
>}
>
> +if (alpha_fmt != AV_PIX_FMT_NONE)
> +*fmt++ = alpha_fmt;
>*fmt++ = sps->pix_fmt;
>*fmt = AV_PIX_FMT_NONE;
>
> @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
> HEVCLayerContext *l,
>!sps->vui.common.video_signal_type_present_flag)
>pix_fmt = sps_base->pix_fmt;
>
> +// Ignore range mismatch between base la

Re: [FFmpeg-devel] [PATCH v5 3/3] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Zhao Zhili


> On Feb 11, 2025, at 16:16, Andreas Rheinhardt 
>  wrote:
> 
> Zhao Zhili:
>> From: Zhao Zhili 
>> 
>> Signed-off-by: Zhao Zhili 
>> ---
>> libavcodec/hevc/hevcdec.c | 72 ++-
>> libavcodec/hevc/hevcdec.h |  2 ++
>> libavcodec/hevc/refs.c| 11 +-
>> 3 files changed, 83 insertions(+), 2 deletions(-)
>> 
>> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
>> index e9c045f7a1..1cdc28de50 100644
>> --- a/libavcodec/hevc/hevcdec.c
>> +++ b/libavcodec/hevc/hevcdec.c
>> @@ -466,6 +466,24 @@ static int export_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>> return 0;
>> }
>> 
>> +int ff_hevc_is_alpha_video(const HEVCContext *s) {
> 
> '{’ should be on its own line.

Fixed in v6.

> 
>> +const HEVCVPS *vps = s->vps;
>> +int ret = 0;
>> +
>> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
>> +return 0;
>> +
>> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
>> other
>> + * than alpha cannot reach here.
>> + */
>> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
>> +
>> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
>> +   ret ? "is" : "not");
>> +
>> +return ret;
>> +}
>> +
>> static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
>> {
>> unsigned layers_active_output = 0, highest_layer;
>> @@ -473,6 +491,18 @@ static int setup_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>> s->layers_active_output = 1;
>> s->layers_active_decode = 1;
>> 
>> +if (ff_hevc_is_alpha_video(s)) {
>> +const AVPixFmtDescriptor *desc = 
>> av_pix_fmt_desc_get(s->avctx->pix_fmt);
>> +
>> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
>> +return 0;
>> +
>> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
>> +s->layers_active_output = 1;
>> +
>> +return 0;
>> +}
>> +
>> // nothing requested - decode base layer only
>> if (!s->nb_view_ids)
>> return 0;
>> @@ -530,6 +560,34 @@ static int setup_multilayer(HEVCContext *s, const 
>> HEVCVPS *vps)
>> return 0;
>> }
>> 
>> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
>> +  enum AVPixelFormat pix_fmt)
>> +{
>> +switch (pix_fmt) {
>> +case AV_PIX_FMT_YUV420P:
>> +case AV_PIX_FMT_YUVJ420P:
>> +return AV_PIX_FMT_YUVA420P;
>> +case AV_PIX_FMT_YUV420P10:
>> +return AV_PIX_FMT_YUVA420P10;
>> +case AV_PIX_FMT_YUV444P:
>> +return AV_PIX_FMT_YUVA444P;
>> +case AV_PIX_FMT_YUV422P:
>> +return AV_PIX_FMT_YUVA422P;
>> +case AV_PIX_FMT_YUV422P10LE:
>> +return AV_PIX_FMT_YUVA422P10LE;
>> +case AV_PIX_FMT_YUV444P10:
>> +return AV_PIX_FMT_YUVA444P10;
>> +case AV_PIX_FMT_YUV444P12:
>> +return AV_PIX_FMT_YUVA444P12;
>> +case AV_PIX_FMT_YUV422P12:
>> +return AV_PIX_FMT_YUVA422P12;
>> +default:
>> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
>> %s\n",
>> +   av_get_pix_fmt_name(pix_fmt));
>> +return AV_PIX_FMT_NONE;
>> +}
>> +}
>> +
>> static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
>> {
>> #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
>> @@ -540,9 +598,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>> const HEVCSPS *sps)
>>  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
>>  CONFIG_HEVC_VDPAU_HWACCEL + \
>>  CONFIG_HEVC_VULKAN_HWACCEL)
>> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
>> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
>> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>> int ret;
>> 
>> +if (ff_hevc_is_alpha_video(s))
>> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
>> +
>> switch (sps->pix_fmt) {
>> case AV_PIX_FMT_YUV420P:
>> case AV_PIX_FMT_YUVJ420P:
>> @@ -664,6 +726,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
>> const HEVCSPS *sps)
>> break;
>> }
>> 
>> +if (alpha_fmt != AV_PIX_FMT_NONE)
>> +*fmt++ = alpha_fmt;
>> *fmt++ = sps->pix_fmt;
>> *fmt = AV_PIX_FMT_NONE;
>> 
>> @@ -3194,6 +3258,12 @@ static int hevc_frame_start(HEVCContext *s, 
>> HEVCLayerContext *l,
>> !sps->vui.common.video_signal_type_present_flag)
>> pix_fmt = sps_base->pix_fmt;
>> 
>> +// Ignore range mismatch between base layer and alpha layer
>> +if (ff_hevc_is_alpha_video(s) &&
>> +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
>> +pix_fmt == AV_PIX_FMT_YUVJ420P)
>> +pix_fmt = sps_base->pix_fmt;
>> +
>> if (pix_fmt != sps_base->pix_fmt ||
>> sps->width  != sps_base->width   ||
>> sps->height != sps_base->height) {
>> diff --git a/libavcodec/hevc/hevcde

Re: [FFmpeg-devel] [PATCH] avformat/mov: Store trak > udta metadata on each stream

2025-02-11 Thread Martin Storsjö

On Tue, 4 Feb 2025, Martin Storsjö wrote:


Hi Rémi,

On Wed, 15 Jan 2025, Rémi Bernon wrote:


Some files keep extra metadata such as 'name' fields within udta, and
it is useful for Wine to access them with the "export_all" option so
they can then be exposed to Windows applications.

Signed-off-by: Rémi Bernon 
---
libavformat/mov.c | 10 --
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index c016ce8e41..f067ca4905 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -354,6 +354,12 @@ static int mov_read_udta_string(MOVContext *c, 
AVIOContext *pb, MOVAtom atom)

int (*parse)(MOVContext*, AVIOContext*, unsigned, const char*) = NULL;
int raw = 0;
int num = 0;
+AVDictionary **metadata;
+
+if (c->trak_index >= 0 && c->trak_index < c->fc->nb_streams)
+metadata = &c->fc->streams[c->trak_index]->metadata;
+else
+metadata = &c->fc->metadata;

switch (atom.type) {
case MKTAG( '@','P','R','M'): key = "premiere_version"; raw = 1; break;
@@ -572,10 +578,10 @@ retry:
str[str_size] = 0;
}
c->fc->event_flags |= AVFMT_EVENT_FLAG_METADATA_UPDATED;
-av_dict_set(&c->fc->metadata, key, str, 0);
+av_dict_set(metadata, key, str, 0);
if (*language && strcmp(language, "und")) {
snprintf(key2, sizeof(key2), "%s-%s", key, language);
-av_dict_set(&c->fc->metadata, key2, str, 0);
+av_dict_set(metadata, key2, str, 0);
}
if (!strcmp(key, "encoder")) {
int major, minor, micro;
--
2.45.2


So instead of storing metadata on the demuxer level, it is stored on the 
stream level, to avoid clobbering metadata if multiple streams provide 
metadata with the same name.


I guess that sounds reasonable. However, wouldn't this be a notable change 
for consumers that currently expect to see such metadata on the demuxer 
level?


I guess we don't have any firm guarantees about such things, and if the 
metadata specifically is for a track, it is the more correct thing to do 
anyway.


I don't have all the usual cases around mov/mp4 metadata fresh in mind 
though. CCing James to hear his opinion on this.


I discussed this with James on irc, and he pointed out that udta can exist 
both on the top level and within the track boxes. And this patch does the 
right thing wrt that, as trak_index is >= 0 while parsing a trak, 
otherwise it's < 0.


So this patch seems correct here, so I'll go ahead and push it.

// 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] swscale/aarch64/rgb2rgb_neon: Implemented uyvytoyuv422

2025-02-11 Thread Krzysztof Pyrkosz via ffmpeg-devel
On Mon, Feb 10, 2025 at 03:15:35PM +0200, Martin Storsjö wrote:
> > Just as I'm about to send this patch, I'm thinking if non-interleaved
> > read followed by 4 invocations of TBL wouldn't be more performant. One
> > call to generate a contiguous vector of u, second for v and two for y.
> > I'm curious to find out.
> 
> My guess is that it may be more performant on more modern cores, but
> probably not on older ones.

That's the case. It's 15% faster on A78 and twice as slow on A72.

> 
> > +sxtw x7, w7
> > +ldrswx8, [sp]
> > +ubfx x10, x4, #1, #31
> 
> The ubfx instruction is kinda esoteric; I presume what you're doing here is
> essentially the same as "lsr #1"? That'd be much more idiomatic and
> readable.

That's correct. What put me off was that register 4 is passed as int
(w4) and I expected register 10 to be 64 bits long with high bits set to
0. lsr w10, w4, #1 already does that.

I modified the code to handle {uyvy,yuyv}toyuv{420,422} using macros,
since these 4 functions share common routines. The code lost on the
readability, though.

Krzysztof
>From a27f554ada9f2e81b4b19d313c9f19b348824ef1 Mon Sep 17 00:00:00 2001
From: Krzysztof Pyrkosz 
Date: Tue, 11 Feb 2025 22:04:19 +0100
Subject: [PATCH] swscale/aarch64/rgb2rgb_neon: Implemented uyvytoyuv422

---
 libswscale/aarch64/rgb2rgb.c  |  16 ++
 libswscale/aarch64/rgb2rgb_neon.S | 262 ++
 tests/checkasm/sw_rgb.c   |  63 ---
 3 files changed, 318 insertions(+), 23 deletions(-)

diff --git a/libswscale/aarch64/rgb2rgb.c b/libswscale/aarch64/rgb2rgb.c
index 7e1dba572d..f474228298 100644
--- a/libswscale/aarch64/rgb2rgb.c
+++ b/libswscale/aarch64/rgb2rgb.c
@@ -67,6 +67,18 @@ void ff_shuffle_bytes_2013_neon(const uint8_t *src, uint8_t *dst, int src_size);
 void ff_shuffle_bytes_2130_neon(const uint8_t *src, uint8_t *dst, int src_size);
 void ff_shuffle_bytes_1203_neon(const uint8_t *src, uint8_t *dst, int src_size);
 
+void ff_uyvytoyuv422_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
+void ff_uyvytoyuv420_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
+void ff_yuyvtoyuv420_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
+void ff_yuyvtoyuv422_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
 av_cold void rgb2rgb_init_aarch64(void)
 {
 int cpu_flags = av_get_cpu_flags();
@@ -84,5 +96,9 @@ av_cold void rgb2rgb_init_aarch64(void)
 shuffle_bytes_2013 = ff_shuffle_bytes_2013_neon;
 shuffle_bytes_2130 = ff_shuffle_bytes_2130_neon;
 shuffle_bytes_1203 = ff_shuffle_bytes_1203_neon;
+uyvytoyuv422   = ff_uyvytoyuv422_neon;
+uyvytoyuv420   = ff_uyvytoyuv420_neon;
+yuyvtoyuv422   = ff_yuyvtoyuv422_neon;
+yuyvtoyuv420   = ff_yuyvtoyuv420_neon;
 }
 }
diff --git a/libswscale/aarch64/rgb2rgb_neon.S b/libswscale/aarch64/rgb2rgb_neon.S
index 22ecdf7ac8..9002aa028f 100644
--- a/libswscale/aarch64/rgb2rgb_neon.S
+++ b/libswscale/aarch64/rgb2rgb_neon.S
@@ -427,3 +427,265 @@ neon_shuf 2013
 neon_shuf 1203
 neon_shuf 2130
 neon_shuf 3210
+
+/*
+v0-v7 - two consecutive lines
+x0 - upper Y destination
+x1 - U destination
+x2 - V destination
+x3 - upper src line
+w5 - width/iteration counter - count of line pairs for yuv420, of single lines for 422
+x6 - lum padding
+x7 - chrom padding
+x8 - src padding
+w9 - number of bytes remaining in the tail
+x10 - lower Y destination
+w12 - tmp
+x13 - lower src line
+w14 - tmp
+w17 - set to 1 if last line has to be handled separately (odd height)
+*/
+
+// one fast path iteration processes 16 uyvy tuples
+// is_line_tail is set to 1 when final 16 tuples are being processed
+// skip_storing_chroma is set to 1 when final line is processed and the height is odd
+.macro fastpath_iteration src_fmt, dst_fmt, is_line_tail, skip_storing_chroma
+ld4 {v0.16b - v3.16b}, [x3], #64
+.if ! \is_line_tail
+subsw14, w14, #32
+.endif
+
+.if ! \skip_storing_chroma
+.if \dst_fmt == yuv420
+ld4 {v4.16b - v7.16b}, [x13], #64
+.endif
+
+.if \dst_fmt == yuv420// store UV
+.if \src_fmt == uyvy
+uhadd   v0.16b, v4.16b, v0.16b// halving sum of U
+uhadd   v2.16b, v6.16b, v2.16b// halving sum of V
+.else
+uhadd   v1.16b, v5.16b, v1.16b   

[FFmpeg-devel] [PATCH 2/2] swscale/aarch64/rgb2rgb_neon: Implemented {yuyv, uyvy}toyuv{420, 422}

2025-02-11 Thread Krzysztof Pyrkosz via ffmpeg-devel
---
 libswscale/aarch64/rgb2rgb.c  |  16 ++
 libswscale/aarch64/rgb2rgb_neon.S | 262 ++
 2 files changed, 278 insertions(+)

diff --git a/libswscale/aarch64/rgb2rgb.c b/libswscale/aarch64/rgb2rgb.c
index 7e1dba572d..f474228298 100644
--- a/libswscale/aarch64/rgb2rgb.c
+++ b/libswscale/aarch64/rgb2rgb.c
@@ -67,6 +67,18 @@ void ff_shuffle_bytes_2013_neon(const uint8_t *src, uint8_t 
*dst, int src_size);
 void ff_shuffle_bytes_2130_neon(const uint8_t *src, uint8_t *dst, int 
src_size);
 void ff_shuffle_bytes_1203_neon(const uint8_t *src, uint8_t *dst, int 
src_size);
 
+void ff_uyvytoyuv422_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
+void ff_uyvytoyuv420_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
+void ff_yuyvtoyuv420_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
+void ff_yuyvtoyuv422_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
 av_cold void rgb2rgb_init_aarch64(void)
 {
 int cpu_flags = av_get_cpu_flags();
@@ -84,5 +96,9 @@ av_cold void rgb2rgb_init_aarch64(void)
 shuffle_bytes_2013 = ff_shuffle_bytes_2013_neon;
 shuffle_bytes_2130 = ff_shuffle_bytes_2130_neon;
 shuffle_bytes_1203 = ff_shuffle_bytes_1203_neon;
+uyvytoyuv422   = ff_uyvytoyuv422_neon;
+uyvytoyuv420   = ff_uyvytoyuv420_neon;
+yuyvtoyuv422   = ff_yuyvtoyuv422_neon;
+yuyvtoyuv420   = ff_yuyvtoyuv420_neon;
 }
 }
diff --git a/libswscale/aarch64/rgb2rgb_neon.S 
b/libswscale/aarch64/rgb2rgb_neon.S
index 22ecdf7ac8..9002aa028f 100644
--- a/libswscale/aarch64/rgb2rgb_neon.S
+++ b/libswscale/aarch64/rgb2rgb_neon.S
@@ -427,3 +427,265 @@ neon_shuf 2013
 neon_shuf 1203
 neon_shuf 2130
 neon_shuf 3210
+
+/*
+v0-v7 - two consecutive lines
+x0 - upper Y destination
+x1 - U destination
+x2 - V destination
+x3 - upper src line
+w5 - width/iteration counter - count of line pairs for yuv420, of single lines 
for 422
+x6 - lum padding
+x7 - chrom padding
+x8 - src padding
+w9 - number of bytes remaining in the tail
+x10 - lower Y destination
+w12 - tmp
+x13 - lower src line
+w14 - tmp
+w17 - set to 1 if last line has to be handled separately (odd height)
+*/
+
+// one fast path iteration processes 16 uyvy tuples
+// is_line_tail is set to 1 when final 16 tuples are being processed
+// skip_storing_chroma is set to 1 when final line is processed and the height 
is odd
+.macro fastpath_iteration src_fmt, dst_fmt, is_line_tail, skip_storing_chroma
+ld4 {v0.16b - v3.16b}, [x3], #64
+.if ! \is_line_tail
+subsw14, w14, #32
+.endif
+
+.if ! \skip_storing_chroma
+.if \dst_fmt == yuv420
+ld4 {v4.16b - v7.16b}, [x13], #64
+.endif
+
+.if \dst_fmt == yuv420// store UV
+.if \src_fmt == uyvy
+uhadd   v0.16b, v4.16b, v0.16b// halving sum of U
+uhadd   v2.16b, v6.16b, v2.16b// halving sum of V
+.else
+uhadd   v1.16b, v5.16b, v1.16b// halving sum of U
+uhadd   v3.16b, v7.16b, v3.16b// halving sum of V
+.endif
+.endif
+
+.if \src_fmt == uyvy
+st1 {v2.16b}, [x2], #16
+st1 {v0.16b}, [x1], #16
+.else
+st1 {v3.16b}, [x2], #16
+st1 {v1.16b}, [x1], #16
+.endif
+
+.if \dst_fmt == yuv420// store_y
+.if \src_fmt == uyvy
+mov v6.16b, v5.16b
+st2 {v6.16b,v7.16b}, [x10], #32
+.else
+mov v5.16b, v4.16b
+st2 {v5.16b,v6.16b}, [x10], #32
+.endif
+.endif
+
+.endif // ! \skip_storing_chroma
+
+.if \src_fmt == uyvy
+mov v2.16b, v1.16b
+st2 {v2.16b,v3.16b}, [x0], #32
+.else
+mov v1.16b, v0.16b
+st2 {v1.16b,v2.16b}, [x0], #32
+.endif
+.endm
+
+// shift pointers back to width - 32 to process the tail of the line
+// if the height is odd, processing the final line is simplified
+.macro fastpath_shift_back_pointers src_fmt, dst_fmt, is_final_odd_line
+add x3, x3, w9, sxtw #1
+sub x3, x3, #64
+.if ! \is_final_odd_line
+.if \dst_fmt == yuv420
+add x13, x13, w9, sxtw #1
+sub x13, x13, #64
+add x10, x10, w9, sxtw
+sub 

[FFmpeg-devel] [PATCH 1/2] tests/checkasm/sw_rgb: Added {yuyv, uyvy}toyuv{420, 422} test cases

2025-02-11 Thread Krzysztof Pyrkosz via ffmpeg-devel
Splitting the previous patch into two.
I noticed that on my x86 box, one of the newly added tests fail:

MMXEXT:
   uyvytoyuv420_mmxext (sw_rgb.c:126)
   yuyvtoyuv420_mmxext (sw_rgb.c:126)
 - sw_rgb.uyvytoyuv  [FAILED]

SSE2, AVX and AVX2 are passing, though.

---
 tests/checkasm/sw_rgb.c | 63 ++---
 1 file changed, 40 insertions(+), 23 deletions(-)

diff --git a/tests/checkasm/sw_rgb.c b/tests/checkasm/sw_rgb.c
index b98c7c6b47..183b4eeaa8 100644
--- a/tests/checkasm/sw_rgb.c
+++ b/tests/checkasm/sw_rgb.c
@@ -61,7 +61,7 @@ static void check_shuffle_bytes(void * func, const char * 
report)
 memcpy(src1, src0, MAX_STRIDE);
 
 if (check_func(func, "%s", report)) {
-for (i = 0; i < 6; i ++) {
+for (i = 0; i < FF_ARRAY_ELEMS(width); i ++) {
 call_ref(src0, dst0, width[i]);
 call_new(src1, dst1, width[i]);
 if (memcmp(dst0, dst1, MAX_STRIDE))
@@ -71,9 +71,24 @@ static void check_shuffle_bytes(void * func, const char * 
report)
 }
 }
 
-static void check_uyvy_to_422p(void)
+typedef void (*uyvy_to_yuv_func)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+   const uint8_t *src, int width, int height,
+   int lumStride, int chromStride, int srcStride);
+
+typedef struct
+{
+uyvy_to_yuv_func func;
+const char* from;
+int to;
+} uyvy_to_yuv_f;
+
+static void check_uyvy_to_yuv(void)
 {
 int i;
+uyvy_to_yuv_f funcs[] = {
+   {uyvytoyuv420, "uyvy", 420}, {uyvytoyuv422, "uyvy", 422},
+   {yuyvtoyuv420, "yuyv", 420}, {yuyvtoyuv422, "yuyv", 422}
+};
 
 LOCAL_ALIGNED_32(uint8_t, src0, [MAX_STRIDE * MAX_HEIGHT * 2]);
 LOCAL_ALIGNED_32(uint8_t, src1, [MAX_STRIDE * MAX_HEIGHT * 2]);
@@ -91,26 +106,28 @@ static void check_uyvy_to_422p(void)
 randomize_buffers(src0, MAX_STRIDE * MAX_HEIGHT * 2);
 memcpy(src1, src0, MAX_STRIDE * MAX_HEIGHT * 2);
 
-if (check_func(uyvytoyuv422, "uyvytoyuv422")) {
-for (i = 0; i < 6; i ++) {
-memset(dst_y_0, 0, MAX_STRIDE * MAX_HEIGHT);
-memset(dst_y_1, 0, MAX_STRIDE * MAX_HEIGHT);
-memset(dst_u_0, 0, (MAX_STRIDE/2) * MAX_HEIGHT);
-memset(dst_u_1, 0, (MAX_STRIDE/2) * MAX_HEIGHT);
-memset(dst_v_0, 0, (MAX_STRIDE/2) * MAX_HEIGHT);
-memset(dst_v_1, 0, (MAX_STRIDE/2) * MAX_HEIGHT);
-
-call_ref(dst_y_0, dst_u_0, dst_v_0, src0, planes[i].w, planes[i].h,
- MAX_STRIDE, MAX_STRIDE / 2, planes[i].s);
-call_new(dst_y_1, dst_u_1, dst_v_1, src1, planes[i].w, planes[i].h,
- MAX_STRIDE, MAX_STRIDE / 2, planes[i].s);
-if (memcmp(dst_y_0, dst_y_1, MAX_STRIDE * MAX_HEIGHT) ||
-memcmp(dst_u_0, dst_u_1, (MAX_STRIDE/2) * MAX_HEIGHT) ||
-memcmp(dst_v_0, dst_v_1, (MAX_STRIDE/2) * MAX_HEIGHT))
-fail();
+for (int k = 0; k < FF_ARRAY_ELEMS(funcs); k ++) {
+   if (check_func(funcs[k].func, "%stoyuv%d",funcs[k].from, funcs[k].to)) {
+   for (i = 0; i < FF_ARRAY_ELEMS(planes); i ++) {
+   memset(dst_y_0, 0, MAX_STRIDE * MAX_HEIGHT);
+   memset(dst_y_1, 0, MAX_STRIDE * MAX_HEIGHT);
+   memset(dst_u_0, 0, (MAX_STRIDE/2) * MAX_HEIGHT);
+   memset(dst_u_1, 0, (MAX_STRIDE/2) * MAX_HEIGHT);
+   memset(dst_v_0, 0, (MAX_STRIDE/2) * MAX_HEIGHT);
+   memset(dst_v_1, 0, (MAX_STRIDE/2) * MAX_HEIGHT);
+
+   call_ref(dst_y_0, dst_u_0, dst_v_0, src0, planes[i].w, 
planes[i].h,
+MAX_STRIDE, MAX_STRIDE / 2, planes[i].s);
+   call_new(dst_y_1, dst_u_1, dst_v_1, src1, planes[i].w, 
planes[i].h,
+MAX_STRIDE, MAX_STRIDE / 2, planes[i].s);
+   if (memcmp(dst_y_0, dst_y_1, MAX_STRIDE * MAX_HEIGHT) ||
+   memcmp(dst_u_0, dst_u_1, (MAX_STRIDE/2) * MAX_HEIGHT) ||
+   memcmp(dst_v_0, dst_v_1, (MAX_STRIDE/2) * MAX_HEIGHT))
+   fail();
+   }
+   bench_new(dst_y_1, dst_u_1, dst_v_1, src1, planes[5].w, planes[5].h,
+ MAX_STRIDE, MAX_STRIDE / 2, planes[5].s);
 }
-bench_new(dst_y_1, dst_u_1, dst_v_1, src1, planes[5].w, planes[5].h,
-  MAX_STRIDE, MAX_STRIDE / 2, planes[5].s);
 }
 }
 
@@ -834,8 +851,8 @@ void checkasm_check_sw_rgb(void)
 check_shuffle_bytes(shuffle_bytes_2130, "shuffle_bytes_2130");
 report("shuffle_bytes_2130");
 
-check_uyvy_to_422p();
-report("uyvytoyuv422");
+check_uyvy_to_yuv();
+report("uyvytoyuv");
 
 check_interleave_bytes();
 report("interleave_bytes");
-- 
2.47.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".


Re: [FFmpeg-devel] GSoC 2025

2025-02-11 Thread Steven Liu
Michael Niedermayer 于2025年1月28日 周二10:21写道:

> Hi
>
> Everyone interested in mentoring a project in 2025, please add your
> idea(s) to [1].
>
> during February 11 - 26 "Google program administrators review organization
> applications"
> That means that by February 11th the list of ideas must be completed
>
Deadline 11th Feb reminder :)


> [1] https://trac.ffmpeg.org/wiki/SponsoringPrograms/GSoC/2025
>
> thx
>
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> What is money laundering? Its paying someone and not telling the
> government.
> ___
> 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 v5 3/3] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Andreas Rheinhardt
Zhao Zhili:
> From: Zhao Zhili 
> 
> Signed-off-by: Zhao Zhili 
> ---
>  libavcodec/hevc/hevcdec.c | 72 ++-
>  libavcodec/hevc/hevcdec.h |  2 ++
>  libavcodec/hevc/refs.c| 11 +-
>  3 files changed, 83 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
> index e9c045f7a1..1cdc28de50 100644
> --- a/libavcodec/hevc/hevcdec.c
> +++ b/libavcodec/hevc/hevcdec.c
> @@ -466,6 +466,24 @@ static int export_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>  return 0;
>  }
>  
> +int ff_hevc_is_alpha_video(const HEVCContext *s) {

'{’ should be on its own line.

> +const HEVCVPS *vps = s->vps;
> +int ret = 0;
> +
> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
> +return 0;
> +
> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
> other
> + * than alpha cannot reach here.
> + */
> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
> +
> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
> +   ret ? "is" : "not");
> +
> +return ret;
> +}
> +
>  static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
>  {
>  unsigned layers_active_output = 0, highest_layer;
> @@ -473,6 +491,18 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>  s->layers_active_output = 1;
>  s->layers_active_decode = 1;
>  
> +if (ff_hevc_is_alpha_video(s)) {
> +const AVPixFmtDescriptor *desc = 
> av_pix_fmt_desc_get(s->avctx->pix_fmt);
> +
> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
> +return 0;
> +
> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
> +s->layers_active_output = 1;
> +
> +return 0;
> +}
> +
>  // nothing requested - decode base layer only
>  if (!s->nb_view_ids)
>  return 0;
> @@ -530,6 +560,34 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>  return 0;
>  }
>  
> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
> +  enum AVPixelFormat pix_fmt)
> +{
> +switch (pix_fmt) {
> +case AV_PIX_FMT_YUV420P:
> +case AV_PIX_FMT_YUVJ420P:
> +return AV_PIX_FMT_YUVA420P;
> +case AV_PIX_FMT_YUV420P10:
> +return AV_PIX_FMT_YUVA420P10;
> +case AV_PIX_FMT_YUV444P:
> +return AV_PIX_FMT_YUVA444P;
> +case AV_PIX_FMT_YUV422P:
> +return AV_PIX_FMT_YUVA422P;
> +case AV_PIX_FMT_YUV422P10LE:
> +return AV_PIX_FMT_YUVA422P10LE;
> +case AV_PIX_FMT_YUV444P10:
> +return AV_PIX_FMT_YUVA444P10;
> +case AV_PIX_FMT_YUV444P12:
> +return AV_PIX_FMT_YUVA444P12;
> +case AV_PIX_FMT_YUV422P12:
> +return AV_PIX_FMT_YUVA422P12;
> +default:
> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
> %s\n",
> +   av_get_pix_fmt_name(pix_fmt));
> +return AV_PIX_FMT_NONE;
> +}
> +}
> +
>  static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
>  {
>  #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
> @@ -540,9 +598,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
>   CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
>   CONFIG_HEVC_VDPAU_HWACCEL + \
>   CONFIG_HEVC_VULKAN_HWACCEL)
> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>  int ret;
>  
> +if (ff_hevc_is_alpha_video(s))
> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
> +
>  switch (sps->pix_fmt) {
>  case AV_PIX_FMT_YUV420P:
>  case AV_PIX_FMT_YUVJ420P:
> @@ -664,6 +726,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
>  break;
>  }
>  
> +if (alpha_fmt != AV_PIX_FMT_NONE)
> +*fmt++ = alpha_fmt;
>  *fmt++ = sps->pix_fmt;
>  *fmt = AV_PIX_FMT_NONE;
>  
> @@ -3194,6 +3258,12 @@ static int hevc_frame_start(HEVCContext *s, 
> HEVCLayerContext *l,
>  !sps->vui.common.video_signal_type_present_flag)
>  pix_fmt = sps_base->pix_fmt;
>  
> +// Ignore range mismatch between base layer and alpha layer
> +if (ff_hevc_is_alpha_video(s) &&
> +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
> +pix_fmt == AV_PIX_FMT_YUVJ420P)
> +pix_fmt = sps_base->pix_fmt;
> +
>  if (pix_fmt != sps_base->pix_fmt ||
>  sps->width  != sps_base->width   ||
>  sps->height != sps_base->height) {
> diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
> index 4e95035688..b2b725b5cd 100644
> --- a/libavcodec/hevc/hevcdec.h
> +++ b/libavcodec/hevc/hevcdec.h
> @@ -714,6 +714,8 @@ void ff_hevc_hls_residua

[FFmpeg-devel] avoption: make the avoption like seekable more general

2025-02-11 Thread Jack Lau
Hi everyone,

I’m trying to solve this issue https://trac.ffmpeg.org/ticket/11394.

This ticket shows that we need use `-seekable` and `-http_seekable` to control 
the range header if send.

Because these options belong to different file(hls.c and http.c)

So I try to modify the http_seekable to seekable in hls.c, but I realized the 
avoption parameter will be released after being used once. 

In that case, the init_input and read_header functions in avformat_open_input 
of demux.c used avoption successively, resulting in no seekable parameter in 
the second part of the http request (it has been used and released by 
init_input). So the second part of http request still not controled by the 
seekable option.

I think it’s necessary to make the avoption used be more general, it can be 
more friendly to users, there is no need for users to use two options for the 
same function. So I have two solutions here:

1. Do not release avoption immediately after use, to ensure that all avoptions 
have a complete life cycle in avformat_open_input, but this will cause a 
problem, that is, it is impossible to determine which options are used and 
which are not used.

2. Add new avoption type like general_avoption which has a longer life cycle 
than ordinary avoption, so that ordinary avoption can still retain the feature 
of being detected whether it is used.

Anyone feel free to give me some advice, I really want to make some 
contribution for this issue.

Thanks
Jack
___
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] lavc/videotoolboxenc: Add spatial_aq option

2025-02-11 Thread Martin Storsjö

On Tue, 4 Feb 2025, Martin Storsjö wrote:


On Mon, 16 Dec 2024, Dennis Sädtler via ffmpeg-devel wrote:


From: Dennis Sädtler 

Added in macOS 15 "Sequoia".

Signed-off-by: Dennis Sädtler 
---
Fixed line-endings, otherwise identical to v1.

libavcodec/videotoolboxenc.c | 12 
1 file changed, 12 insertions(+)

diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
index da7b291b03..fb2de7b960 100644
--- a/libavcodec/videotoolboxenc.c
+++ b/libavcodec/videotoolboxenc.c
@@ -121,6 +121,7 @@ static struct{
CFStringRef 
kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality;

CFStringRef kVTCompressionPropertyKey_ConstantBitRate;
CFStringRef kVTCompressionPropertyKey_EncoderID;
+CFStringRef kVTCompressionPropertyKey_SpatialAdaptiveQPLevel;

CFStringRef 
kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder;
CFStringRef 
kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder;

@@ -208,6 +209,7 @@ static void loadVTEncSymbols(void){
"ReferenceBufferCount");
GET_SYM(kVTCompressionPropertyKey_MaxAllowedFrameQP, 
"MaxAllowedFrameQP");
GET_SYM(kVTCompressionPropertyKey_MinAllowedFrameQP, 
"MinAllowedFrameQP");
+GET_SYM(kVTCompressionPropertyKey_SpatialAdaptiveQPLevel, 
"SpatialAdaptiveQPLevel");

}

#define H264_PROFILE_CONSTRAINED_HIGH (AV_PROFILE_H264_HIGH | 
AV_PROFILE_H264_CONSTRAINED)

@@ -279,6 +281,7 @@ typedef struct VTEncContext {
int max_slice_bytes;
int power_efficient;
int max_ref_frames;
+int spatialaq;
} VTEncContext;

static void vtenc_free_buf_node(BufNode *info)
@@ -1599,6 +1602,13 @@ static int vtenc_create_encoder(AVCodecContext 
*avctx,

}
}

+if (vtctx->spatialaq >= 0) {
+set_encoder_int_property_or_log(avctx,
+ 
compat_keys.kVTCompressionPropertyKey_SpatialAdaptiveQPLevel,

+"spatialaq",
+vtctx->spatialaq ? 
kVTQPModulationLevel_Default : kVTQPModulationLevel_Disable);


These constants aren't available if building with an older SDK, so this would 
break building in such cases.


For other similar cases of compile time constants that may or may not be 
available, we have configure checks and provide the constants ourselves - 
that seems to be reasonable here too.


With the following changes on top, it seems to build successfully even for 
older versions:



diff --git a/configure b/configure
index 32fbe58126..020c2af843 100755
--- a/configure
+++ b/configure
@@ -2490,6 +2490,7 @@ TYPES_LIST="
kCVImageBufferColorPrimaries_ITU_R_2020
kCVImageBufferTransferFunction_ITU_R_2020
kCVImageBufferTransferFunction_SMPTE_ST_428_1
+kVTQPModulationLevel_Default
socklen_t
struct_addrinfo
struct_group_source_req
@@ -6748,6 +6749,7 @@ enabled videotoolbox && {
check_func_headers CoreVideo/CVImageBuffer.h 
kCVImageBufferColorPrimaries_ITU_R_2020 "-framework CoreVideo"
check_func_headers CoreVideo/CVImageBuffer.h 
kCVImageBufferTransferFunction_ITU_R_2020 "-framework CoreVideo"
check_func_headers CoreVideo/CVImageBuffer.h 
kCVImageBufferTransferFunction_SMPTE_ST_428_1 "-framework CoreVideo"
+check_func_headers VideoToolbox/VTCompressionProperties.h 
kVTQPModulationLevel_Default "-framework CoreVideo"

}

enabled metal && test_cmd $metalcc -v || disable metal
diff --git a/libavcodec/videotoolboxenc.c b/libavcodec/videotoolboxenc.c
index fb2de7b960..950a29d9fa 100644
--- a/libavcodec/videotoolboxenc.c
+++ b/libavcodec/videotoolboxenc.c
@@ -54,6 +54,11 @@ enum { kCVPixelFormatType_420YpCbCr10BiPlanarFullRange = 
'xf20' };

enum { kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange = 'x420' };
#endif

+#if !HAVE_KVTQPMODULATIONLEVEL_DEFAULT
+enum { kVTQPModulationLevel_Default = -1 };
+enum { kVTQPModulationLevel_Disable = 0 };
+#endif
+
#ifndef TARGET_CPU_ARM64
#   define TARGET_CPU_ARM64 0
#endif


If you don't mind these changes, I could push the patch with these changes 
squashed in.


Will push with these changes.

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


[FFmpeg-devel] [PATCH v6 3/3] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Zhao Zhili
From: Zhao Zhili 

Signed-off-by: Zhao Zhili 
---
 libavcodec/hevc/hevcdec.c | 73 ++-
 libavcodec/hevc/hevcdec.h |  2 ++
 libavcodec/hevc/refs.c| 34 +-
 3 files changed, 107 insertions(+), 2 deletions(-)

diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
index e9c045f7a1..f71edf213b 100644
--- a/libavcodec/hevc/hevcdec.c
+++ b/libavcodec/hevc/hevcdec.c
@@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
 }
 
+int ff_hevc_is_alpha_video(const HEVCContext *s)
+{
+const HEVCVPS *vps = s->vps;
+int ret = 0;
+
+if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
+return 0;
+
+/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId other
+ * than alpha cannot reach here.
+ */
+ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
+
+av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
+   ret ? "is" : "not");
+
+return ret;
+}
+
 static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
 {
 unsigned layers_active_output = 0, highest_layer;
@@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 s->layers_active_output = 1;
 s->layers_active_decode = 1;
 
+if (ff_hevc_is_alpha_video(s)) {
+const AVPixFmtDescriptor *desc = 
av_pix_fmt_desc_get(s->avctx->pix_fmt);
+
+if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
+return 0;
+
+s->layers_active_decode = (1 << vps->nb_layers) - 1;
+s->layers_active_output = 1;
+
+return 0;
+}
+
 // nothing requested - decode base layer only
 if (!s->nb_view_ids)
 return 0;
@@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const HEVCVPS 
*vps)
 return 0;
 }
 
+static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
+  enum AVPixelFormat pix_fmt)
+{
+switch (pix_fmt) {
+case AV_PIX_FMT_YUV420P:
+case AV_PIX_FMT_YUVJ420P:
+return AV_PIX_FMT_YUVA420P;
+case AV_PIX_FMT_YUV420P10:
+return AV_PIX_FMT_YUVA420P10;
+case AV_PIX_FMT_YUV444P:
+return AV_PIX_FMT_YUVA444P;
+case AV_PIX_FMT_YUV422P:
+return AV_PIX_FMT_YUVA422P;
+case AV_PIX_FMT_YUV422P10LE:
+return AV_PIX_FMT_YUVA422P10LE;
+case AV_PIX_FMT_YUV444P10:
+return AV_PIX_FMT_YUVA444P10;
+case AV_PIX_FMT_YUV444P12:
+return AV_PIX_FMT_YUVA444P12;
+case AV_PIX_FMT_YUV422P12:
+return AV_PIX_FMT_YUVA422P12;
+default:
+av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for %s\n",
+   av_get_pix_fmt_name(pix_fmt));
+return AV_PIX_FMT_NONE;
+}
+}
+
 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
 {
 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
@@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
  CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
  CONFIG_HEVC_VDPAU_HWACCEL + \
  CONFIG_HEVC_VULKAN_HWACCEL)
-enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
+enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
+enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
 int ret;
 
+if (ff_hevc_is_alpha_video(s))
+alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
+
 switch (sps->pix_fmt) {
 case AV_PIX_FMT_YUV420P:
 case AV_PIX_FMT_YUVJ420P:
@@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, const 
HEVCSPS *sps)
 break;
 }
 
+if (alpha_fmt != AV_PIX_FMT_NONE)
+*fmt++ = alpha_fmt;
 *fmt++ = sps->pix_fmt;
 *fmt = AV_PIX_FMT_NONE;
 
@@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
HEVCLayerContext *l,
 !sps->vui.common.video_signal_type_present_flag)
 pix_fmt = sps_base->pix_fmt;
 
+// Ignore range mismatch between base layer and alpha layer
+if (ff_hevc_is_alpha_video(s) &&
+sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
+pix_fmt == AV_PIX_FMT_YUVJ420P)
+pix_fmt = sps_base->pix_fmt;
+
 if (pix_fmt != sps_base->pix_fmt ||
 sps->width  != sps_base->width   ||
 sps->height != sps_base->height) {
diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
index 4e95035688..b2b725b5cd 100644
--- a/libavcodec/hevc/hevcdec.h
+++ b/libavcodec/hevc/hevcdec.h
@@ -714,6 +714,8 @@ void ff_hevc_hls_residual_coding(HEVCLocalContext *lc, 
const HEVCPPS *pps,
 
 void ff_hevc_hls_mvd_coding(HEVCLocalContext *lc, int x0, int y0, int 
log2_cb_size);
 
+int ff_hevc_is_alpha_video(const HEVCContext *s);
+
 extern const uint8_t ff_hevc_qpel_extra_before[4];
 extern const uint8_t ff_hevc_qpel_extra_after[4];
 extern const uint8_

[FFmpeg-devel] [PATCH v6 1/3] avcodec/hevc: Rewrite scalability_mask_flag parse in decode_vps_ext

2025-02-11 Thread Zhao Zhili
From: Zhao Zhili 

Remove a for loop and make it easy to extend to support other types
of scalability. Move ScalabilityMask to hevc header file so it can
be used in hevc decoder.

Signed-off-by: Zhao Zhili 
---
 libavcodec/hevc/hevc.h |  7 +++
 libavcodec/hevc/ps.c   | 33 +++--
 libavcodec/hevc/ps.h   |  2 ++
 3 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/libavcodec/hevc/hevc.h b/libavcodec/hevc/hevc.h
index 8bd59142db..b2229fda40 100644
--- a/libavcodec/hevc/hevc.h
+++ b/libavcodec/hevc/hevc.h
@@ -162,5 +162,12 @@ enum {
 HEVC_MAX_PALETTE_PREDICTOR_SIZE = 128,
 };
 
+enum HEVCScalabilityMask {
+HEVC_SCALABILITY_DEPTH  = 1 << (15 - 0),
+HEVC_SCALABILITY_MULTIVIEW  = 1 << (15 - 1),
+HEVC_SCALABILITY_SPATIAL= 1 << (15 - 2),
+HEVC_SCALABILITY_AUXILIARY  = 1 << (15 - 3),
+HEVC_SCALABILITY_MASK_MAX   = 0x,
+};
 
 #endif /* AVCODEC_HEVC_HEVC_H */
diff --git a/libavcodec/hevc/ps.c b/libavcodec/hevc/ps.c
index 285084685b..861a6bb0a2 100644
--- a/libavcodec/hevc/ps.c
+++ b/libavcodec/hevc/ps.c
@@ -450,14 +450,6 @@ static void hevc_vps_free(AVRefStructOpaque opaque, void 
*obj)
 av_freep(&vps->data);
 }
 
-enum ScalabilityMask {
-HEVC_SCALABILITY_DEPTH  = 0,
-HEVC_SCALABILITY_MULTIVIEW  = 1,
-HEVC_SCALABILITY_SPATIAL= 2,
-HEVC_SCALABILITY_AUXILIARY  = 3,
-HEVC_SCALABILITY_MASK_MAX   = 15,
-};
-
 enum DependencyType {
 HEVC_DEP_TYPE_SAMPLE = 0,
 HEVC_DEP_TYPE_MV = 1,
@@ -532,17 +524,22 @@ static int decode_vps_ext(GetBitContext *gb, 
AVCodecContext *avctx, HEVCVPS *vps
 return AVERROR_INVALIDDATA;
 
 splitting_flag = get_bits1(gb);
-num_scalability_types = 0;
-for (int i = 0; i <= HEVC_SCALABILITY_MASK_MAX; i++) {
-int scalability_mask_flag = get_bits1(gb);
-if (scalability_mask_flag && (i != HEVC_SCALABILITY_MULTIVIEW)) {
-av_log(avctx, AV_LOG_ERROR, "Scalability type %d not supported\n", 
i);
-return AVERROR_PATCHWELCOME;
-}
-num_scalability_types += scalability_mask_flag;
-}
-if (num_scalability_types != 1)
+vps->scalability_mask_flag = get_bits(gb, 16);
+num_scalability_types = av_popcount(vps->scalability_mask_flag);
+if (!num_scalability_types) {
+av_log(avctx, AV_LOG_ERROR, "Missing scalability mask\n");
 return AVERROR_INVALIDDATA;
+} else if (num_scalability_types > 1) {
+av_log(avctx, AV_LOG_ERROR, "Scalability number %d not supported\n",
+   num_scalability_types);
+return AVERROR_PATCHWELCOME;
+}
+
+if (!(vps->scalability_mask_flag & HEVC_SCALABILITY_MULTIVIEW)) {
+av_log(avctx, AV_LOG_ERROR, "Scalability type %d not supported\n",
+   15 - ff_ctz(vps->scalability_mask_flag));
+return AVERROR_PATCHWELCOME;
+}
 
 if (!splitting_flag)
 dimension_id_len = get_bits(gb, 3) + 1;
diff --git a/libavcodec/hevc/ps.h b/libavcodec/hevc/ps.h
index 6f5b1f8755..d3465e3d27 100644
--- a/libavcodec/hevc/ps.h
+++ b/libavcodec/hevc/ps.h
@@ -205,6 +205,8 @@ typedef struct HEVCVPS {
  */
 int nb_layers;
 
+uint16_t scalability_mask_flag;
+
 // LayerIdxInVps[nuh_layer_id], i.e. a mapping of nuh_layer_id to VPS layer
 // indices. Valid values are between 0 and HEVC_VPS_MAX_LAYERS. Entries for
 // unmapped values of nuh_layer_id are set to -1.
-- 
2.46.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 v6 2/3] avcodec/hevc/ps: Add basic HEVC_SCALABILITY_AUXILIARY support

2025-02-11 Thread Zhao Zhili
From: Zhao Zhili 

Only implementing what's needed for HEVC with alpha.

Signed-off-by: Zhao Zhili 
---
 libavcodec/hevc/hevc.h |   5 ++
 libavcodec/hevc/ps.c   | 125 +
 libavcodec/hevc/ps.h   |   1 +
 3 files changed, 95 insertions(+), 36 deletions(-)

diff --git a/libavcodec/hevc/hevc.h b/libavcodec/hevc/hevc.h
index b2229fda40..710786a89d 100644
--- a/libavcodec/hevc/hevc.h
+++ b/libavcodec/hevc/hevc.h
@@ -170,4 +170,9 @@ enum HEVCScalabilityMask {
 HEVC_SCALABILITY_MASK_MAX   = 0x,
 };
 
+enum HEVCAuxId {
+HEVC_AUX_ALPHA = 1,
+HEVC_AUX_DEPTH = 2,
+};
+
 #endif /* AVCODEC_HEVC_HEVC_H */
diff --git a/libavcodec/hevc/ps.c b/libavcodec/hevc/ps.c
index 861a6bb0a2..24f4218931 100644
--- a/libavcodec/hevc/ps.c
+++ b/libavcodec/hevc/ps.c
@@ -460,14 +460,17 @@ static int decode_vps_ext(GetBitContext *gb, 
AVCodecContext *avctx, HEVCVPS *vps
   uint64_t layer1_id_included)
 {
 PTL ptl_dummy;
-uint8_t max_sub_layers[HEVC_MAX_LAYERS];
+uint8_t max_sub_layers[HEVC_MAX_LAYERS] = {1, 1};
+uint8_t dimension_id_len[16] = {0};
+uint8_t dimension_id[16] = {0};
+unsigned n;
 
-int splitting_flag, dimension_id_len, view_id_len, num_add_olss, 
num_scalability_types,
+int splitting_flag, view_id_len, num_add_olss, num_scalability_types,
 default_output_layer_idc, direct_dep_type_len, direct_dep_type,
 sub_layers_max_present, sub_layer_flag_info_present_flag, nb_ptl;
 unsigned non_vui_extension_length;
 
-if (vps->vps_max_layers == 1 || vps->vps_num_layer_sets == 1) {
+if (vps->vps_max_layers == 1) {
 av_log(avctx, AV_LOG_VERBOSE, "Ignoring VPS extensions with a single 
layer\n");
 return 0;
 }
@@ -520,6 +523,7 @@ static int decode_vps_ext(GetBitContext *gb, AVCodecContext 
*avctx, HEVCVPS *vps
  */
 vps->nb_layers = 2;
 
+/* vps_base_layer_internal_flag is true has been checked before */
 if (parse_ptl(gb, avctx, 0, &ptl_dummy, vps->vps_max_sub_layers) < 0)
 return AVERROR_INVALIDDATA;
 
@@ -529,20 +533,25 @@ static int decode_vps_ext(GetBitContext *gb, 
AVCodecContext *avctx, HEVCVPS *vps
 if (!num_scalability_types) {
 av_log(avctx, AV_LOG_ERROR, "Missing scalability mask\n");
 return AVERROR_INVALIDDATA;
-} else if (num_scalability_types > 1) {
-av_log(avctx, AV_LOG_ERROR, "Scalability number %d not supported\n",
-   num_scalability_types);
-return AVERROR_PATCHWELCOME;
 }
 
-if (!(vps->scalability_mask_flag & HEVC_SCALABILITY_MULTIVIEW)) {
+if (!(vps->scalability_mask_flag &
+  (HEVC_SCALABILITY_MULTIVIEW | HEVC_SCALABILITY_AUXILIARY))) {
 av_log(avctx, AV_LOG_ERROR, "Scalability type %d not supported\n",
15 - ff_ctz(vps->scalability_mask_flag));
 return AVERROR_PATCHWELCOME;
 }
+// x265 specify MULTIVIEW when the stream really is alpha video only.
+if (num_scalability_types > 1)
+av_log(avctx, AV_LOG_WARNING, "Multiple scalability types 
presented\n");
 
-if (!splitting_flag)
-dimension_id_len = get_bits(gb, 3) + 1;
+n = 0;
+for (int i = 0; i < num_scalability_types - splitting_flag; i++) {
+dimension_id_len[i] = get_bits(gb, 3) + 1;
+n += dimension_id_len[i];
+}
+if (splitting_flag)
+dimension_id_len[num_scalability_types - 1] = 5 - n;
 
 if (get_bits1(gb)) { /* vps_nuh_layer_id_present_flag */
 int layer_id_in_nuh = get_bits(gb, 6);
@@ -559,28 +568,57 @@ static int decode_vps_ext(GetBitContext *gb, 
AVCodecContext *avctx, HEVCVPS *vps
 }
 
 if (!splitting_flag) {
-int view_idx = get_bits(gb, dimension_id_len);
-if (view_idx != 1) {
-av_log(avctx, AV_LOG_ERROR, "Unexpected ViewOrderIdx: %d\n", 
view_idx);
+int index = 0;
+
+for (int i = 0; i < num_scalability_types; i++)
+dimension_id[i] = get_bits(gb, dimension_id_len[i]);
+
+if (vps->scalability_mask_flag & HEVC_SCALABILITY_MULTIVIEW)
+index++;
+
+/* AuxId 1 is alpha, 2 is depth. Only support alpha */
+if (vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY &&
+dimension_id[index] != HEVC_AUX_ALPHA) {
+av_log(avctx, AV_LOG_WARNING,
+   "Unsupported dimension_id %d for 
HEVC_SCALABILITY_AUXILIARY\n",
+   dimension_id[index]);
 return AVERROR_PATCHWELCOME;
 }
 }
 
 view_id_len = get_bits(gb, 4);
-if (view_id_len)
-for (int i = 0; i < 2 /* NumViews */; i++)
+if (view_id_len) {
+n = (vps->scalability_mask_flag & HEVC_SCALABILITY_MULTIVIEW) ? 2 : 1;
+for (int i = 0; i < n; i++)
 vps->view_id[i] = get_bits(gb, view_id_len);
+}
 
-if (!get_bits1(gb) /* direct_dependency_flag */) {
-av_log(avctx, AV_LOG_WARNING, "Independent output layers not 
supported\n");
-   

Re: [FFmpeg-devel] [PATCH v2 5/6] avcodec/hevc/sei: dynamically allocate 3D Reference Displays Information SEI messages

2025-02-11 Thread Michael Niedermayer
On Sun, Feb 09, 2025 at 09:59:06PM -0300, James Almer wrote:
> On 2/9/2025 9:53 PM, Michael Niedermayer wrote:
> > Hi
> > 
> > On Wed, Feb 05, 2025 at 11:50:17PM -0300, James Almer wrote:
> > > Considerably reduces the size of HEVCSEI.
> > > 
> > > Signed-off-by: James Almer 
> > > ---
> > > Fixed segfaults.
> > > 
> > >   libavcodec/hevc/hevcdec.c | 10 +-
> > >   libavcodec/hevc/refs.c|  4 ++--
> > >   libavcodec/hevc/sei.c |  6 +-
> > >   libavcodec/hevc/sei.h |  6 +-
> > >   4 files changed, 17 insertions(+), 9 deletions(-)
> > 
> > seems not applying on ma local tree, do you have some branch i can just 
> > merge
> > to test this ?
> > 
> > thx
> 
> Sure, pushed to https://github.com/jamrial/FFmpeg/commits/tdrdi/

that resolves the issue i saw

thx

[...]

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Republics decline into democracies and democracies degenerate into
despotisms. -- Aristotle


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 v6 3/3] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Zhao Zhili


> On Feb 11, 2025, at 20:12, Andreas Rheinhardt 
>  wrote:
> 
> Zhao Zhili:
>> 
>> 
>>> On Feb 11, 2025, at 19:23, Andreas Rheinhardt 
>>>  wrote:
>>> 
>>> Zhao Zhili:
 From: Zhao Zhili 
 
 Signed-off-by: Zhao Zhili 
 ---
 libavcodec/hevc/hevcdec.c | 73 ++-
 libavcodec/hevc/hevcdec.h |  2 ++
 libavcodec/hevc/refs.c| 34 +-
 3 files changed, 107 insertions(+), 2 deletions(-)
 
 diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
 index e9c045f7a1..f71edf213b 100644
 --- a/libavcodec/hevc/hevcdec.c
 +++ b/libavcodec/hevc/hevcdec.c
 @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
 HEVCVPS *vps)
return 0;
 }
 
 +int ff_hevc_is_alpha_video(const HEVCContext *s)
 +{
 +const HEVCVPS *vps = s->vps;
 +int ret = 0;
 +
 +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
 +return 0;
 +
 +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
 other
 + * than alpha cannot reach here.
 + */
 +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
 +
 +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
 +   ret ? "is" : "not");
 +
 +return ret;
 +}
 +
 static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
 {
unsigned layers_active_output = 0, highest_layer;
 @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
 HEVCVPS *vps)
s->layers_active_output = 1;
s->layers_active_decode = 1;
 
 +if (ff_hevc_is_alpha_video(s)) {
 +const AVPixFmtDescriptor *desc = 
 av_pix_fmt_desc_get(s->avctx->pix_fmt);
 +
 +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
 +return 0;
 +
 +s->layers_active_decode = (1 << vps->nb_layers) - 1;
 +s->layers_active_output = 1;
 +
 +return 0;
 +}
 +
// nothing requested - decode base layer only
if (!s->nb_view_ids)
return 0;
 @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
 HEVCVPS *vps)
return 0;
 }
 
 +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
 +  enum AVPixelFormat pix_fmt)
 +{
 +switch (pix_fmt) {
 +case AV_PIX_FMT_YUV420P:
 +case AV_PIX_FMT_YUVJ420P:
 +return AV_PIX_FMT_YUVA420P;
 +case AV_PIX_FMT_YUV420P10:
 +return AV_PIX_FMT_YUVA420P10;
 +case AV_PIX_FMT_YUV444P:
 +return AV_PIX_FMT_YUVA444P;
 +case AV_PIX_FMT_YUV422P:
 +return AV_PIX_FMT_YUVA422P;
 +case AV_PIX_FMT_YUV422P10LE:
 +return AV_PIX_FMT_YUVA422P10LE;
 +case AV_PIX_FMT_YUV444P10:
 +return AV_PIX_FMT_YUVA444P10;
 +case AV_PIX_FMT_YUV444P12:
 +return AV_PIX_FMT_YUVA444P12;
 +case AV_PIX_FMT_YUV422P12:
 +return AV_PIX_FMT_YUVA422P12;
 +default:
 +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
 %s\n",
 +   av_get_pix_fmt_name(pix_fmt));
 +return AV_PIX_FMT_NONE;
 +}
 +}
 +
 static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
 {
 #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
 @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
 const HEVCSPS *sps)
 CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
 CONFIG_HEVC_VDPAU_HWACCEL + \
 CONFIG_HEVC_VULKAN_HWACCEL)
 -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
 +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
 +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
int ret;
 
 +if (ff_hevc_is_alpha_video(s))
 +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
 +
switch (sps->pix_fmt) {
case AV_PIX_FMT_YUV420P:
case AV_PIX_FMT_YUVJ420P:
 @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
 const HEVCSPS *sps)
break;
}
 
 +if (alpha_fmt != AV_PIX_FMT_NONE)
 +*fmt++ = alpha_fmt;
*fmt++ = sps->pix_fmt;
*fmt = AV_PIX_FMT_NONE;
 
 @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
 HEVCLayerContext *l,
!sps->vui.common.video_signal_type_present_flag)
pix_fmt = sps_base->pix_fmt;
 
 +// Ignore range mismatch between base layer and alpha layer
 +if (ff_hevc_is_alpha_video(s) &&
 +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
 +  

Re: [FFmpeg-devel] [PATCH v7 3/4] avcodec/hevc: Add alpha layer support

2025-02-11 Thread Andreas Rheinhardt
Zhao Zhili:
> From: Zhao Zhili 
> 
> Signed-off-by: Zhao Zhili 
> ---
>  libavcodec/hevc/hevcdec.c | 73 ++-
>  libavcodec/hevc/hevcdec.h |  2 ++
>  libavcodec/hevc/refs.c| 35 ++-
>  3 files changed, 108 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/hevc/hevcdec.c b/libavcodec/hevc/hevcdec.c
> index e9c045f7a1..f71edf213b 100644
> --- a/libavcodec/hevc/hevcdec.c
> +++ b/libavcodec/hevc/hevcdec.c
> @@ -466,6 +466,25 @@ static int export_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>  return 0;
>  }
>  
> +int ff_hevc_is_alpha_video(const HEVCContext *s)
> +{
> +const HEVCVPS *vps = s->vps;
> +int ret = 0;
> +
> +if (vps->nb_layers != 2 || !vps->layer_id_in_nuh[1])
> +return 0;
> +
> +/* decode_vps_ext() guarantees that SCALABILITY_AUXILIARY with AuxId 
> other
> + * than alpha cannot reach here.
> + */
> +ret = (s->vps->scalability_mask_flag & HEVC_SCALABILITY_AUXILIARY);
> +
> +av_log(s->avctx, AV_LOG_DEBUG, "Multi layer video, %s alpha video\n",
> +   ret ? "is" : "not");
> +
> +return ret;
> +}
> +
>  static int setup_multilayer(HEVCContext *s, const HEVCVPS *vps)
>  {
>  unsigned layers_active_output = 0, highest_layer;
> @@ -473,6 +492,18 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>  s->layers_active_output = 1;
>  s->layers_active_decode = 1;
>  
> +if (ff_hevc_is_alpha_video(s)) {
> +const AVPixFmtDescriptor *desc = 
> av_pix_fmt_desc_get(s->avctx->pix_fmt);
> +
> +if (!(desc->flags & AV_PIX_FMT_FLAG_ALPHA))
> +return 0;
> +
> +s->layers_active_decode = (1 << vps->nb_layers) - 1;
> +s->layers_active_output = 1;
> +
> +return 0;
> +}
> +
>  // nothing requested - decode base layer only
>  if (!s->nb_view_ids)
>  return 0;
> @@ -530,6 +561,34 @@ static int setup_multilayer(HEVCContext *s, const 
> HEVCVPS *vps)
>  return 0;
>  }
>  
> +static enum AVPixelFormat map_to_alpha_format(HEVCContext *s,
> +  enum AVPixelFormat pix_fmt)
> +{
> +switch (pix_fmt) {
> +case AV_PIX_FMT_YUV420P:
> +case AV_PIX_FMT_YUVJ420P:
> +return AV_PIX_FMT_YUVA420P;
> +case AV_PIX_FMT_YUV420P10:
> +return AV_PIX_FMT_YUVA420P10;
> +case AV_PIX_FMT_YUV444P:
> +return AV_PIX_FMT_YUVA444P;
> +case AV_PIX_FMT_YUV422P:
> +return AV_PIX_FMT_YUVA422P;
> +case AV_PIX_FMT_YUV422P10LE:
> +return AV_PIX_FMT_YUVA422P10LE;
> +case AV_PIX_FMT_YUV444P10:
> +return AV_PIX_FMT_YUVA444P10;
> +case AV_PIX_FMT_YUV444P12:
> +return AV_PIX_FMT_YUVA444P12;
> +case AV_PIX_FMT_YUV422P12:
> +return AV_PIX_FMT_YUVA422P12;
> +default:
> +av_log(s->avctx, AV_LOG_WARNING, "No alpha pixel format map for 
> %s\n",
> +   av_get_pix_fmt_name(pix_fmt));
> +return AV_PIX_FMT_NONE;
> +}
> +}
> +
>  static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
>  {
>  #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL + \
> @@ -540,9 +599,13 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
>   CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + \
>   CONFIG_HEVC_VDPAU_HWACCEL + \
>   CONFIG_HEVC_VULKAN_HWACCEL)
> -enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
> +enum AVPixelFormat pix_fmts[HWACCEL_MAX + 3], *fmt = pix_fmts;
> +enum AVPixelFormat alpha_fmt = AV_PIX_FMT_NONE;
>  int ret;
>  
> +if (ff_hevc_is_alpha_video(s))
> +alpha_fmt = map_to_alpha_format(s, sps->pix_fmt);
> +
>  switch (sps->pix_fmt) {
>  case AV_PIX_FMT_YUV420P:
>  case AV_PIX_FMT_YUVJ420P:
> @@ -664,6 +727,8 @@ static enum AVPixelFormat get_format(HEVCContext *s, 
> const HEVCSPS *sps)
>  break;
>  }
>  
> +if (alpha_fmt != AV_PIX_FMT_NONE)
> +*fmt++ = alpha_fmt;
>  *fmt++ = sps->pix_fmt;
>  *fmt = AV_PIX_FMT_NONE;
>  
> @@ -3194,6 +3259,12 @@ static int hevc_frame_start(HEVCContext *s, 
> HEVCLayerContext *l,
>  !sps->vui.common.video_signal_type_present_flag)
>  pix_fmt = sps_base->pix_fmt;
>  
> +// Ignore range mismatch between base layer and alpha layer
> +if (ff_hevc_is_alpha_video(s) &&
> +sps_base->pix_fmt == AV_PIX_FMT_YUV420P &&
> +pix_fmt == AV_PIX_FMT_YUVJ420P)
> +pix_fmt = sps_base->pix_fmt;
> +
>  if (pix_fmt != sps_base->pix_fmt ||
>  sps->width  != sps_base->width   ||
>  sps->height != sps_base->height) {
> diff --git a/libavcodec/hevc/hevcdec.h b/libavcodec/hevc/hevcdec.h
> index 4e95035688..b2b725b5cd 100644
> --- a/libavcodec/hevc/hevcdec.h
> +++ b/libavcodec/hevc/hevcdec.h
> @@ -714,6 +714,8 @@ void ff_hevc_hls_residual_coding(HEVCLoc

Re: [FFmpeg-devel] [PATCH] avcodec/vorbisdec: don't abort on EOD when decoding residuals

2025-02-11 Thread Michael Niedermayer
Hi James

On Fri, Feb 07, 2025 at 01:47:51PM -0300, James Almer wrote:
> Fixes ticket #11427
> 
> Signed-off-by: James Almer 
> ---
> It may be a good idea to ensure the timeout fuzzer case doesn't regress
> after this.
> 
>  libavcodec/vorbisdec.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/libavcodec/vorbisdec.c b/libavcodec/vorbisdec.c
> index 218e855f7a..321408723d 100644
> --- a/libavcodec/vorbisdec.c
> +++ b/libavcodec/vorbisdec.c
> @@ -1470,7 +1470,7 @@ static av_always_inline int 
> vorbis_residue_decode_internal(vorbis_context *vc,
>  vorbis_codebook codebook = vc->codebooks[vqbook];
>  
>  if (get_bits_left(gb) <= 0)
> -return AVERROR_INVALIDDATA;
> +return 0;

This looks suspect

For the test sample from #11427 get_bits_left() at this point is -8
that means 8 bits have already been read beyond the buffer.
wherever the error is, reading 8 bits beyond is unlikely to be
the correct and intended behavior

I think the question would be, what created this file and how
exactly does libvorbis handle it, does it also read beyond the buffer

That is, do we have a encoder or a decoder bug, and what is that
bug exactly

thx

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

Those who would give up essential Liberty, to purchase a little
temporary Safety, deserve neither Liberty nor Safety -- Benjamin Franklin


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] GSoC 2025

2025-02-11 Thread Michael Niedermayer
Hi everyone

On Wed, Feb 12, 2025 at 06:30:11AM +0800, Steven Liu wrote:
> Michael Niedermayer 于2025年1月28日 周二10:21写道:
> 
> > Hi
> >
> > Everyone interested in mentoring a project in 2025, please add your
> > idea(s) to [1].
> >
> > during February 11 - 26 "Google program administrators review organization
> > applications"
> > That means that by February 11th the list of ideas must be completed
> >

> Deadline 11th Feb reminder :)

Yeah, i thought the other admins would take care of this like last years
Noone said they would ignore the page

So this is a bit an "emergency", can people please help bring this
in shape ASAP. It already should be

Steven, do you have time to help ?
If so please add some projects, ask people who mentored previously
to add some projects

same question for everyone else

thx

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

Freedom in capitalist society always remains about the same as it was in
ancient Greek republics: Freedom for slave owners. -- Vladimir Lenin


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] GSoC 2025

2025-02-11 Thread Kieran Kunhya via ffmpeg-devel
On Wed, 12 Feb 2025, 00:20 Michael Niedermayer, 
wrote:

> Hi everyone
>
> On Wed, Feb 12, 2025 at 06:30:11AM +0800, Steven Liu wrote:
> > Michael Niedermayer 于2025年1月28日 周二10:21写道:
> >
> > > Hi
> > >
> > > Everyone interested in mentoring a project in 2025, please add your
> > > idea(s) to [1].
> > >
> > > during February 11 - 26 "Google program administrators review
> organization
> > > applications"
> > > That means that by February 11th the list of ideas must be completed
> > >
>
> > Deadline 11th Feb reminder :)
>
> Yeah, i thought the other admins would take care of this like last years
> Noone said they would ignore the page
>
> So this is a bit an "emergency", can people please help bring this
> in shape ASAP. It already should be
>
> Steven, do you have time to help ?
> If so please add some projects, ask people who mentored previously
> to add some projects
>
> same question for everyone else
>
> thx
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Freedom in capitalist society always remains about the same as it was in
> ancient Greek republics: Freedom for slave owners. -- Vladimir Lenin
>

Sneaking in your pet SDR project is unacceptable.

Kieran

>
___
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] [RFC] GSoC 2025 SDR Cleanup

2025-02-11 Thread Michael Niedermayer
Hi all

Ive added SDR to our GSoC 2025 page as there was just a single project
on that page and the page needs to be more complete yesterday

If people are against this say this NOW do not wait until we have accepted
a student and then start some drama
It can be removed now easily but not once someone is working on it

What is this project about ?
It is about YOU, the community, you disliked how libavradio is interfaced.
It bascially was just a demuxer/input device

So this Project is about someone within GSoC re structuring libavradio
and interfacing with a demuxer/input device as was previously suggested.

Please clearly list all requirements you have for this to get into git master

thx

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I am the wisest man alive, for I know one thing, and that is that I know
nothing. -- Socrates


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] [RFC] GSoC 2025 SDR Cleanup

2025-02-11 Thread Kieran Kunhya via ffmpeg-devel
On Wed, 12 Feb 2025, 01:21 Michael Niedermayer, 
wrote:

> Hi all
>
> Ive added SDR to our GSoC 2025 page as there was just a single project
> on that page and the page needs to be more complete yesterday
>
> If people are against this say this NOW do not wait until we have accepted
> a student and then start some drama
> It can be removed now easily but not once someone is working on it
>
> What is this project about ?
> It is about YOU, the community, you disliked how libavradio is interfaced.
> It bascially was just a demuxer/input device
>
> So this Project is about someone within GSoC re structuring libavradio
> and interfacing with a demuxer/input device as was previously suggested.
>
> Please clearly list all requirements you have for this to get into git
> master
>
> thx
>
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> I am the wisest man alive, for I know one thing, and that is that I know
> nothing. -- Socrates
>

Is this a joke?

Kieran

>
___
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] GSoC 2025

2025-02-11 Thread Marth64
Hi Kieran,

> Adding @Cc
Thanks, acknowledged. I will reach out to you guys via the CC email channel.
___
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] Fw: Only 2 GSoC Project Ideas?

2025-02-11 Thread Michael Niedermayer
Hi everyone

Please add more GSoC Ideas ASAP!

we just got the mail below

thanks

- Forwarded message from Stephanie Taylor  -

Date: Tue, 11 Feb 2025 18:28:56 -0800
From: Stephanie Taylor 
To: Thilo Borgmann , Michael Niedermayer 
, rverd...@gmail.com
Subject: Only 2 GSoC Project Ideas?

Stephanie Taylor  |  Program Manager

*Google Summer of Code* *2025 is here!*

Contributor apps open March 24-April 8

g.co/gsoc  

- End forwarded message -

-- 
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Some Animals are More Equal Than Others. - George Orwell's book Animal Farm


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] [RFC] GSoC 2025 SDR Cleanup

2025-02-11 Thread Kieran Kunhya via ffmpeg-devel
On Wed, 12 Feb 2025, 02:11 Michael Niedermayer, 
wrote:

> On Wed, Feb 12, 2025 at 01:23:09AM +, Kieran Kunhya via ffmpeg-devel
> wrote:
> > Is this a joke?
>
> no
>
> It follows up on Jean Baptistes request here:
> https://lists.ffmpeg.org/pipermail/ffmpeg-devel/2023-August/312915.html
>
> | But it's not a library in that repository, like swscale, swresample or
> similar libraries.
> | If it was, with an API, it would be trivial to add support to this
> optional library as an FFmpeg module, and noone who complain.
>
> So the GSoC contributor would make this change, and then noone will
> complain.
>
> The GSoC contributor will just need precisse instructions so everyone
> will be ok and noone wil complain.
>
> thx
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>

If it's a library outside of FFmpeg, then you are welcome to submit it to
another SDR related Gsoc organisation. By definition your SDR lib is not
part of FFmpeg.

Kieran

>
___
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] swscale/aarch64/rgb2rgb_neon: Implemented uyvytoyuv422

2025-02-11 Thread Krzysztof Pyrkosz via ffmpeg-devel
I forgot to include the benchmarks in the previous message, here they
are:

A78:
uyvytoyuv420_neon:6112.5 ( 6.96x)
uyvytoyuv422_neon:6696.0 ( 6.32x)
yuyvtoyuv420_neon:6113.0 ( 6.95x)
yuyvtoyuv422_neon:6695.2 ( 6.31x)

A72:
uyvytoyuv420_neon:9512.1 ( 6.09x)
uyvytoyuv422_neon:9766.8 ( 6.32x)
yuyvtoyuv420_neon:9639.1 ( 6.00x)
yuyvtoyuv422_neon:9779.0 ( 6.03x)

A53:
uyvytoyuv420_neon:   12720.1 ( 9.10x)
uyvytoyuv422_neon:   14282.9 ( 6.71x)
yuyvtoyuv420_neon:   12637.4 ( 9.15x)
yuyvtoyuv422_neon:   14127.6 ( 6.77x)

---
 libswscale/aarch64/rgb2rgb.c  |  16 ++
 libswscale/aarch64/rgb2rgb_neon.S | 262 ++
 tests/checkasm/sw_rgb.c   |  63 ---
 3 files changed, 318 insertions(+), 23 deletions(-)

diff --git a/libswscale/aarch64/rgb2rgb.c b/libswscale/aarch64/rgb2rgb.c
index 7e1dba572d..f474228298 100644
--- a/libswscale/aarch64/rgb2rgb.c
+++ b/libswscale/aarch64/rgb2rgb.c
@@ -67,6 +67,18 @@ void ff_shuffle_bytes_2013_neon(const uint8_t *src, uint8_t 
*dst, int src_size);
 void ff_shuffle_bytes_2130_neon(const uint8_t *src, uint8_t *dst, int 
src_size);
 void ff_shuffle_bytes_1203_neon(const uint8_t *src, uint8_t *dst, int 
src_size);
 
+void ff_uyvytoyuv422_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
+void ff_uyvytoyuv420_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
+void ff_yuyvtoyuv420_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
+void ff_yuyvtoyuv422_neon(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
+  const uint8_t *src, int width, int height,
+  int lumStride, int chromStride, int srcStride);
 av_cold void rgb2rgb_init_aarch64(void)
 {
 int cpu_flags = av_get_cpu_flags();
@@ -84,5 +96,9 @@ av_cold void rgb2rgb_init_aarch64(void)
 shuffle_bytes_2013 = ff_shuffle_bytes_2013_neon;
 shuffle_bytes_2130 = ff_shuffle_bytes_2130_neon;
 shuffle_bytes_1203 = ff_shuffle_bytes_1203_neon;
+uyvytoyuv422   = ff_uyvytoyuv422_neon;
+uyvytoyuv420   = ff_uyvytoyuv420_neon;
+yuyvtoyuv422   = ff_yuyvtoyuv422_neon;
+yuyvtoyuv420   = ff_yuyvtoyuv420_neon;
 }
 }
diff --git a/libswscale/aarch64/rgb2rgb_neon.S 
b/libswscale/aarch64/rgb2rgb_neon.S
index 22ecdf7ac8..9002aa028f 100644
--- a/libswscale/aarch64/rgb2rgb_neon.S
+++ b/libswscale/aarch64/rgb2rgb_neon.S
@@ -427,3 +427,265 @@ neon_shuf 2013
 neon_shuf 1203
 neon_shuf 2130
 neon_shuf 3210
+
+/*
+v0-v7 - two consecutive lines
+x0 - upper Y destination
+x1 - U destination
+x2 - V destination
+x3 - upper src line
+w5 - width/iteration counter - count of line pairs for yuv420, of single lines 
for 422
+x6 - lum padding
+x7 - chrom padding
+x8 - src padding
+w9 - number of bytes remaining in the tail
+x10 - lower Y destination
+w12 - tmp
+x13 - lower src line
+w14 - tmp
+w17 - set to 1 if last line has to be handled separately (odd height)
+*/
+
+// one fast path iteration processes 16 uyvy tuples
+// is_line_tail is set to 1 when final 16 tuples are being processed
+// skip_storing_chroma is set to 1 when final line is processed and the height 
is odd
+.macro fastpath_iteration src_fmt, dst_fmt, is_line_tail, skip_storing_chroma
+ld4 {v0.16b - v3.16b}, [x3], #64
+.if ! \is_line_tail
+subsw14, w14, #32
+.endif
+
+.if ! \skip_storing_chroma
+.if \dst_fmt == yuv420
+ld4 {v4.16b - v7.16b}, [x13], #64
+.endif
+
+.if \dst_fmt == yuv420// store UV
+.if \src_fmt == uyvy
+uhadd   v0.16b, v4.16b, v0.16b// halving sum of U
+uhadd   v2.16b, v6.16b, v2.16b// halving sum of V
+.else
+uhadd   v1.16b, v5.16b, v1.16b// halving sum of U
+uhadd   v3.16b, v7.16b, v3.16b// halving sum of V
+.endif
+.endif
+
+.if \src_fmt == uyvy
+st1 {v2.16b}, [x2], #16
+st1 {v0.16b}, [x1], #16
+.else
+st1 {v3.16b}, [x2], #16
+st1 {v1.16b}, [x1], #16
+.endif
+
+.if \dst_fmt == yuv420//

[FFmpeg-devel] [PATCH] swscale/aarch64/rgb24toyv12: skip early right shift by 2

2025-02-11 Thread Krzysztof Pyrkosz via ffmpeg-devel
It's a minor improvement that shaves off 5-8% from the execution time.
Instead of shifting by 2 right away and by 7 soon after, shift by 9 one
time.

Times before and after:

A78:
rgb24toyv12_16_200_neon:  5366.8 ( 3.62x)
rgb24toyv12_128_60_neon: 13574.0 ( 3.34x)
rgb24toyv12_512_16_neon: 14463.8 ( 3.33x)
rgb24toyv12_1920_4_neon: 13508.2 ( 3.34x)
rgb24toyv12_1920_4_negstride_neon:   13525.0 ( 3.34x)

rgb24toyv12_16_200_neon:  5293.8 ( 3.66x)
rgb24toyv12_128_60_neon: 12955.0 ( 3.50x)
rgb24toyv12_512_16_neon: 13784.0 ( 3.50x)
rgb24toyv12_1920_4_neon: 12900.8 ( 3.49x)
rgb24toyv12_1920_4_negstride_neon:   12902.8 ( 3.49x)


A72:
rgb24toyv12_16_200_neon:  9695.8 ( 2.50x)
rgb24toyv12_128_60_neon: 20286.6 ( 2.70x)
rgb24toyv12_512_16_neon: 22276.6 ( 2.57x)
rgb24toyv12_1920_4_neon: 19154.1 ( 2.77x)
rgb24toyv12_1920_4_negstride_neon:   19055.1 ( 2.78x)

rgb24toyv12_16_200_neon:  9214.8 ( 2.65x)
rgb24toyv12_128_60_neon: 20731.5 ( 2.65x)
rgb24toyv12_512_16_neon: 21145.0 ( 2.70x)
rgb24toyv12_1920_4_neon: 17586.5 ( 2.99x)
rgb24toyv12_1920_4_negstride_neon:   17571.0 ( 2.98x)


A53:
rgb24toyv12_16_200_neon: 12880.4 ( 3.76x)
rgb24toyv12_128_60_neon: 27776.3 ( 3.94x)
rgb24toyv12_512_16_neon: 29411.3 ( 3.94x)
rgb24toyv12_1920_4_neon: 27253.1 ( 3.98x)
rgb24toyv12_1920_4_negstride_neon:   27474.3 ( 3.95x)

rgb24toyv12_16_200_neon: 12196.3 ( 3.95x)
rgb24toyv12_128_60_neon: 26943.1 ( 4.07x)
rgb24toyv12_512_16_neon: 28642.3 ( 4.07x)
rgb24toyv12_1920_4_neon: 26676.6 ( 4.08x)
rgb24toyv12_1920_4_negstride_neon:   26713.8 ( 4.07x)

---
 libswscale/aarch64/rgb2rgb_neon.S | 24 +++-
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/libswscale/aarch64/rgb2rgb_neon.S 
b/libswscale/aarch64/rgb2rgb_neon.S
index 22ecdf7ac8..97dd781378 100644
--- a/libswscale/aarch64/rgb2rgb_neon.S
+++ b/libswscale/aarch64/rgb2rgb_neon.S
@@ -99,15 +99,16 @@ endconst
 
 // convert rgb to 16-bit y, u, or v
 // uses v3 and v4
-.macro rgbconv16 dst, b, g, r, bc, gc, rc
+
+.macro rgbconv16 dst, b, g, r, bc, gc, rc, shr_bits
 smull   v3.4s, \b\().4h, \bc
 smlal   v3.4s, \g\().4h, \gc
 smlal   v3.4s, \r\().4h, \rc
 smull2  v4.4s, \b\().8h, \bc
 smlal2  v4.4s, \g\().8h, \gc
 smlal2  v4.4s, \r\().8h, \rc// v3:v4 = b * bc + g * gc 
+ r * rc (32-bit)
-shrn\dst\().4h, v3.4s, #7
-shrn2   \dst\().8h, v4.4s, #7   // dst = b * bc + g * gc + 
r * rc (16-bit)
+shrn\dst\().4h, v3.4s, \shr_bits
+shrn2   \dst\().8h, v4.4s, \shr_bits   // dst = b * bc + g 
* gc + r * rc (16-bit)
 .endm
 
 // void ff_rgb24toyv12_neon(const uint8_t *src, uint8_t *ydst, uint8_t *udst,
@@ -171,8 +172,8 @@ function ff_rgb24toyv12_neon, export=1
 uxtl2   v21.8h, v28.16b // v21 = R12
 
 // calculate Y values for first line
-rgbconv16   v24, v16, v17, v18, BY, GY, RY // v24 = Y11
-rgbconv16   v25, v19, v20, v21, BY, GY, RY // v25 = Y12
+rgbconv16   v24, v16, v17, v18, BY, GY, RY, #7 // v24 = Y11
+rgbconv16   v25, v19, v20, v21, BY, GY, RY, #7 // v25 = Y12
 
 // load second line
 ld3 {v26.16b, v27.16b, v28.16b}, [x10], #48
@@ -191,25 +192,22 @@ function ff_rgb24toyv12_neon, export=1
 uxtl2   v21.8h, v28.16b // v21 = R22
 
 // calculate Y values for second line
-rgbconv16   v26, v16, v17, v18, BY, GY, RY // v26 = Y21
-rgbconv16   v27, v19, v20, v21, BY, GY, RY // v27 = Y22
+rgbconv16   v26, v16, v17, v18, BY, GY, RY, #7 // v26 = Y21
+rgbconv16   v27, v19, v20, v21, BY, GY, RY, #7 // v27 = Y22
 
 // pairwise add rgb values to calculate average
 addpv16.8h, v16.8h, v19.8h
 addpv17.8h, v17.8h, v20.8h
 addpv18.8h, v18.8h, v21.8h
 
-// calculate average
+// calculate sum of r, g, b components in 2x2 blocks
 add v16.8h, v16.8h, v5.8h
 add v17.8h, v17.8h, v6.8h
 add v18.8h, v18.8h, v7.8h
-ushr

Re: [FFmpeg-devel] [PATCH] swscale/aarch64/rgb2rgb_neon: Implemented uyvytoyuv422

2025-02-11 Thread Martin Storsjö

On Tue, 11 Feb 2025, Krzysztof Pyrkosz via ffmpeg-devel wrote:


I forgot to include the benchmarks in the previous message, here they
are:

A78:
uyvytoyuv420_neon:6112.5 ( 6.96x)
uyvytoyuv422_neon:6696.0 ( 6.32x)
yuyvtoyuv420_neon:6113.0 ( 6.95x)
yuyvtoyuv422_neon:6695.2 ( 6.31x)

A72:
uyvytoyuv420_neon:9512.1 ( 6.09x)
uyvytoyuv422_neon:9766.8 ( 6.32x)
yuyvtoyuv420_neon:9639.1 ( 6.00x)
yuyvtoyuv422_neon:9779.0 ( 6.03x)

A53:
uyvytoyuv420_neon:   12720.1 ( 9.10x)
uyvytoyuv422_neon:   14282.9 ( 6.71x)
yuyvtoyuv420_neon:   12637.4 ( 9.15x)
yuyvtoyuv422_neon:   14127.6 ( 6.77x)

---
libswscale/aarch64/rgb2rgb.c  |  16 ++
libswscale/aarch64/rgb2rgb_neon.S | 262 ++
tests/checkasm/sw_rgb.c   |  63 ---
3 files changed, 318 insertions(+), 23 deletions(-)


Can you split out the checkasm changes to a separate preceding patch? That 
makes it easier to reason about it, regarding whether the new test 
coverage works for archs with existing asm, etc.


// 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 v2] avcodec/ac3dec: add a flush callback for the ac3 and eac3 decoders

2025-02-11 Thread Michael Niedermayer
Hi James

On Thu, Feb 06, 2025 at 04:17:47PM -0300, James Almer wrote:
> Fixes ticket #10732
> 
> Signed-off-by: James Almer 
> ---
>  libavcodec/ac3dec.c   | 10 ++
>  libavcodec/ac3dec.h   | 40 ++-
>  libavcodec/ac3dec_fixed.c |  1 +
>  libavcodec/ac3dec_float.c |  2 ++
>  4 files changed, 36 insertions(+), 17 deletions(-)
> 
> diff --git a/libavcodec/ac3dec.c b/libavcodec/ac3dec.c
> index ff8cbfb0b4..2cf82abc19 100644
> --- a/libavcodec/ac3dec.c
> +++ b/libavcodec/ac3dec.c
[...]
>  /**
>   * Parse the 'sync info' and 'bit stream info' from the AC-3 bitstream.
>   * GetBitContext within AC3DecodeContext must point to
> diff --git a/libavcodec/ac3dec.h b/libavcodec/ac3dec.h
> index 98de7b5abf..cc6d1a118e 100644
> --- a/libavcodec/ac3dec.h
> +++ b/libavcodec/ac3dec.h
> @@ -75,8 +75,30 @@ typedef struct AC3DecodeContext {
>  AVCodecContext *avctx;  ///< parent context
>  GetBitContext gbc;  ///< bitstream reader
>  
> +AVTXContext *tx_128, *tx_256;
> +av_tx_fn tx_fn_128, tx_fn_256;
> +
> +///@name Optimization
> +BswapDSPContext bdsp;
> +#if USE_FIXED
> +AVFixedDSPContext *fdsp;
> +#else
> +AVFloatDSPContext *fdsp;
> +#endif
> +AC3DSPContext ac3dsp;
> +FmtConvertContext fmt_conv; ///< optimized conversion 
> functions
> +///@}
> +
> +INTFLOAT *xcfptr[AC3_MAX_CHANNELS];
> +INTFLOAT *dlyptr[AC3_MAX_CHANNELS];
> +
> +AVChannelLayout downmix_layout;
> +SHORTFLOAT *downmix_coeffs[2];  ///< stereo downmix 
> coefficients
> +
> +// Start of flushable fields
>  ///@name Bit stream information
>  ///@{
> +// frame_type must be first
>  int frame_type; ///< frame type  
>(strmtyp)
>  int substreamid;///< substream identification
>  int superframe_size;///< current superframe size, in 
> bytes
> @@ -164,7 +186,6 @@ typedef struct AC3DecodeContext {
>  int fbw_channels;   ///< number of 
> full-bandwidth channels
>  int channels;   ///< number of total channels
>  int lfe_ch; ///< index of LFE channel
> -SHORTFLOAT *downmix_coeffs[2];  ///< stereo downmix 
> coefficients
>  int downmixed;  ///< indicates if coeffs are 
> currently downmixed
>  int output_mode;///< output channel 
> configuration
>  int prev_output_mode;   ///< output channel 
> configuration for previous frame
> @@ -222,24 +243,9 @@ typedef struct AC3DecodeContext {
>  
>  ///@name IMDCT
>  int block_switch[AC3_MAX_CHANNELS]; ///< block switch flags  
>(blksw)
> -AVTXContext *tx_128, *tx_256;
> -av_tx_fn tx_fn_128, tx_fn_256;
> -///@}
> -
> -///@name Optimization
> -BswapDSPContext bdsp;
> -#if USE_FIXED
> -AVFixedDSPContext *fdsp;
> -#else
> -AVFloatDSPContext *fdsp;
> -#endif
> -AC3DSPContext ac3dsp;
> -FmtConvertContext fmt_conv; ///< optimized conversion 
> functions
>  ///@}
>  
>  SHORTFLOAT *outptr[AC3_MAX_CHANNELS];
> -INTFLOAT *xcfptr[AC3_MAX_CHANNELS];
> -INTFLOAT *dlyptr[AC3_MAX_CHANNELS];
>  
>  ///@name Aligned arrays
>  DECLARE_ALIGNED(16, int,   
> fixed_coeffs)[AC3_MAX_CHANNELS][AC3_MAX_COEFS];   ///< fixed-point 
> transform coefficients
> @@ -252,7 +258,7 @@ typedef struct AC3DecodeContext {
>  DECLARE_ALIGNED(32, SHORTFLOAT, 
> output_buffer)[EAC3_MAX_CHANNELS][AC3_BLOCK_SIZE * 6];  ///< final output 
> buffer
>  ///@}
>  
> -AVChannelLayout downmix_layout;
> +// End of flushable fields
>  } AC3DecodeContext;

This seems moving fields around,
if so, maybe this should be in a seperate patch

thx

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

Breaking DRM is a little like attempting to break through a door even
though the window is wide open and the only thing in the house is a bunch
of things you dont want and which you would get tomorrow for free anyway


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 v2 2/2] random_seed: Improve behaviour with small timer increments with high precision timers

2025-02-11 Thread Michael Niedermayer
On Mon, Feb 10, 2025 at 03:54:51PM +0200, Martin Storsjö wrote:
> On Sun, 9 Feb 2025, Michael Niedermayer wrote:
> 
> > Hi Martin
> > 
> > On Fri, Feb 07, 2025 at 12:04:53AM +0200, Martin Storsjö wrote:
> > > On Thu, 6 Feb 2025, Michael Niedermayer wrote:
> > > 
> > > > On Thu, Feb 06, 2025 at 02:38:48PM +0200, Martin Storsjö wrote:
> > > > > On Thu, 6 Feb 2025, Michael Niedermayer wrote:
> > > > > 
> > > > > > > +// If the timer resolution is high, and we get the 
> > > > > > > same timer
> > > > > > > +// value multiple times, use variances in the number 
> > > > > > > of repeats
> > > > > > > +// of each timer value as entropy. If the number of 
> > > > > > > repeats changed,
> > > > > > > +// proceed to the next index.
> > > > > > 
> > > > > > Does it still work if you check against the last 2 ?
> > > > > > or does this become too slow ?
> > > > > > What iam thinking of is this
> > > > > > 
> > > > > > 7,8,7,8,8,7,8,7,8,8,7,8,7,8,8,7,8,7,8,8,... and a 9 or 6 or further 
> > > > > > distant would trigger it
> > > > > > 
> > > > > > I assume both the CPU clock and the wall time are quite precisse so 
> > > > > > if we
> > > > > > just compare them the entropy could be low even with 2 alternating 
> > > > > > values
> > > > > 
> > > > > Yes, that still works for making it terminate in a reasonable amount 
> > > > > of
> > > > > time. I updated the patch to keep track of 3 numbers of repeats, and 
> > > > > we
> > > > > consider that we got valid entropy once the new number of repeats is
> > > > > different from the last two.
> > > > > 
> > > > > So in the sequence above, e.g. for 7,8,7,8,8,7, at the point of the 
> > > > > last
> > > > > one, we have old repeats 8 and 8, and the new repeat count 7, which 
> > > > > in that
> > > > > context looks unique.
> > > > 
> > > > I was thinking that in 7,8,8 that 7 and 8 be the 2 least recent used
> > > > values not 8,8
> > > 
> > > Sure, that's probably doable too.
> > > 
> > > > that is, something like:
> > > > 
> > > > if (old2 == new) {
> > > >FFSWAP(old,old2);
> > > 
> > > I don't see why we'd need to check this if clause at all, it seems to me
> > > that it's enough to have the "if (old != new)" case.
> > 
> > > If we have old2 == new,
> > > we'd just end up with old2 = old, and old = (previous old2 value) anyway.
> > 
> > It was intended to be a least recent used check with 2 entries
> > 
> > If we have a clock running and sample that in precise intervalls
> > lets say the clock runs at 1.9hz and we sample at 10hz we would get
> > 
> > clock:0  0  0  0  0  0  1  1  1  1  1  2  2  2  2  2  3  3  3  3  3  3  
> > 4  4  4  4  4  5  5  5  5  5  6  6  6  6  6  7  7  7  7  7  7  8  8  8  8  
> > 8  9  9
> > difference:  0  0  0  0  0  1  0  0  0  0  1  0  0  0  0  1  0  0  0  0  0  
> > 1  0  0  0  0  1  0  0  0  0  1  0  0  0  0  1  0  0  0  0  0  1  0  0  0  
> > 0  1  0
> > 
> > Above adds no entropy after the initial entropy, this can be read forever
> > it will not improve randomness
> > 
> > here we have runs of repeated clock reads of 5,4,4,5,4,4,4,5,4
> > again we can read this as long as we want there is no entropy gained
> > so after a 5,4,4,4 if a 5 happens thats not breaking the pattern and should
> > not be counted as new entropy (if possible)
> 
> Yes, I get that intent.
> 
> It's just that your suggested pseudocode seems unnecessarily complex, or I'm
> missing something:
> 
> if (old2 == new) {
> FFSWAP(old,old2);
> } else if (old != new) {
> old2 = old;
> old = new;
> }
> 
> If we have the sequence "5, 4, 4, 4, 4", followed by another "5", we have
> old2 == 5, old == 4, new == 5. Then we get the same end result (old2 == 4,
> old == 5) both if we execute the code you suggest above, and if we just
> execute this:
> 
> if (old != new) {
> old2 = old;
> old = new;
> }
> 
> Or is there something I'm missing? I don't see the need for the FFSWAP case.
> 
> As long as we check (new != old && new != old2) we should pick up actual
> deviation from the steady state but not the variance between two values.

Heres an example where the SWAP is needed:
 noswap swap
5 -> [x 5]  [x 5]
4 -> [5 4]  [5 4]
5 -> [5 4]  [4 5]
6 -> [4 6]  [5 6]
5 -> [6 5]  [6 5]

In the last case the 5 is in the old* when the swap was used but not
when it was not used

thx

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

Never trust a computer, one day, it may think you are the virus. -- Compn


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] GSoC 2025

2025-02-11 Thread Kieran Kunhya via ffmpeg-devel
Adding @Cc 

This is a blatant attempt to push an unrelated pet project into FFmpeg
under the Gsoc banner with no notice. It's also unfair to students applying
as there was serious community pushback against this last time.

Kieran

On Wed, 12 Feb 2025, 01:16 Kieran Kunhya,  wrote:

>
>
> On Wed, 12 Feb 2025, 00:20 Michael Niedermayer, 
> wrote:
>
>> Hi everyone
>>
>> On Wed, Feb 12, 2025 at 06:30:11AM +0800, Steven Liu wrote:
>> > Michael Niedermayer 于2025年1月28日 周二10:21写道:
>> >
>> > > Hi
>> > >
>> > > Everyone interested in mentoring a project in 2025, please add your
>> > > idea(s) to [1].
>> > >
>> > > during February 11 - 26 "Google program administrators review
>> organization
>> > > applications"
>> > > That means that by February 11th the list of ideas must be completed
>> > >
>>
>> > Deadline 11th Feb reminder :)
>>
>> Yeah, i thought the other admins would take care of this like last years
>> Noone said they would ignore the page
>>
>> So this is a bit an "emergency", can people please help bring this
>> in shape ASAP. It already should be
>>
>> Steven, do you have time to help ?
>> If so please add some projects, ask people who mentored previously
>> to add some projects
>>
>> same question for everyone else
>>
>> thx
>>
>> [...]
>> --
>> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>>
>> Freedom in capitalist society always remains about the same as it was in
>> ancient Greek republics: Freedom for slave owners. -- Vladimir Lenin
>>
>
> Sneaking in your pet SDR project is unacceptable.
>
> Kieran
>
>>
___
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] [RFC] GSoC 2025 SDR Cleanup

2025-02-11 Thread Michael Niedermayer
On Wed, Feb 12, 2025 at 01:23:09AM +, Kieran Kunhya via ffmpeg-devel wrote:
> Is this a joke?

no

It follows up on Jean Baptistes request here:
https://lists.ffmpeg.org/pipermail/ffmpeg-devel/2023-August/312915.html

| But it's not a library in that repository, like swscale, swresample or 
similar libraries.
| If it was, with an API, it would be trivial to add support to this optional 
library as an FFmpeg module, and noone who complain.

So the GSoC contributor would make this change, and then noone will complain.

The GSoC contributor will just need precisse instructions so everyone
will be ok and noone wil complain.

thx

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

Never trust a computer, one day, it may think you are the virus. -- Compn


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] Fw: Only 2 GSoC Project Ideas?

2025-02-11 Thread James Almer

On 2/12/2025 12:02 AM, Michael Niedermayer wrote:

Hi everyone

Please add more GSoC Ideas ASAP!


Adding ideas is not hard, finding people willing to mentor them is. 
Otherwise the page would not be so empty.




we just got the mail below

thanks

- Forwarded message from Stephanie Taylor  -

Date: Tue, 11 Feb 2025 18:28:56 -0800
From: Stephanie Taylor 
To: Thilo Borgmann , Michael Niedermayer 
, rverd...@gmail.com
Subject: Only 2 GSoC Project Ideas?

Stephanie Taylor  |  Program Manager

*Google Summer of Code* *2025 is here!*

Contributor apps open March 24-April 8

g.co/gsoc  

- End forwarded message -


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




OpenPGP_signature.asc
Description: OpenPGP digital 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] GSoC 2025

2025-02-11 Thread Nicolas George
Marth64 (12025-02-11):
> Thanks, acknowledged. I will reach out to you guys via the CC email channel.

“We have promptly and unanimously determined that it has nothing to do
with the mandate of the CC to ensure civility on the mailing-list. Quite
the opposite, we have determined that it is your attempt to weaponize
the CC that constitute an incivility, please do not do so again.”

This is the only answer you should give.

Regards,

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