Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

QSV Overlay Filter: Copy side data from input to output frame #44

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

softworkz
Copy link
Collaborator

@softworkz softworkz commented Oct 24, 2022

This is split out from my earlier patchset "SEI parsing for QSV decoders"
(#31) as it is only logically
related but not technically.

The first patch had been reviewed and partially authored by Anton
(I have indicated this with a signed-off line, please advise in case this
wouldn't be right)

The second patch performs the copying of side data from input to
output frames.

softworkz

v2:

  • Fix commit message (avcodec > avfilter)
  • Bump version in version.h
  • Resolve rebase conflicts

cc: "Xiang, Haihao" haihao.xiang-at-intel.com@ffmpeg.org
cc: Andreas Rheinhardt andreas.rheinhardt@outlook.com
cc: Soft Works softworkz@hotmail.com

@softworkz
Copy link
Collaborator Author

/submit

@ffmpeg-codebot
Copy link

Submitted as pull.44.ffstaging.FFmpeg.1666652664.ffmpegagent@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-44/softworkz/submit_copy_sidedata-v1

To fetch this version to local tag pr-ffstaging-44/softworkz/submit_copy_sidedata-v1:

git fetch --no-tags https://github.com/ffstaging/FFmpeg tag pr-ffstaging-44/softworkz/submit_copy_sidedata-v1

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Nov 1, 2022

User "Xiang, Haihao" <haihao.xiang-at-intel.com@ffmpeg.org> has been added to the cc: list.

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Nov 1, 2022

User "zhilizhao(赵志立)" <quinkblack@foxmail.com> has been added to the cc: list.

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Nov 2, 2022

User Andreas Rheinhardt <andreas.rheinhardt@outlook.com> has been added to the cc: list.

…ide_data()

Signed-off-by: softworkz <softworkz@hotmail.com>
Signed-off-by: Anton Khirnov <anton@khirnov.net>
@softworkz
Copy link
Collaborator Author

/submit

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Nov 2, 2022

User Soft Works <softworkz@hotmail.com> has been added to the cc: list.

Signed-off-by: softworkz <softworkz@hotmail.com>
@softworkz
Copy link
Collaborator Author

/submit

@softworkz
Copy link
Collaborator Author

/rgegeg

@softworkz
Copy link
Collaborator Author

/help

@softworkz
Copy link
Collaborator Author

/submit

3 similar comments
@softworkz
Copy link
Collaborator Author

/submit

@softworkz
Copy link
Collaborator Author

/submit

@softworkz
Copy link
Collaborator Author

/submit

@ffmpeg-codebot
Copy link

ffmpeg-codebot bot commented Nov 3, 2022

Submitted as pull.44.v2.ffstaging.FFmpeg.1667475701.ffmpegagent@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-44/softworkz/submit_copy_sidedata-v2

To fetch this version to local tag pr-ffstaging-44/softworkz/submit_copy_sidedata-v2:

git fetch --no-tags https://github.com/ffstaging/FFmpeg tag pr-ffstaging-44/softworkz/submit_copy_sidedata-v2

@@ -14,6 +14,10 @@ libavutil: 2021-04-27

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the FFmpeg mailing list, "Xiang, Haihao" wrote (reply to this):

On Thu, 2022-11-03 at 11:41 +0000, softworkz wrote:
> From: softworkz <softworkz@hotmail.com>
> 
> Signed-off-by: softworkz <softworkz@hotmail.com>
> Signed-off-by: Anton Khirnov <anton@khirnov.net>
> ---
>  doc/APIchanges      |  4 +++
>  libavutil/frame.c   | 67 +++++++++++++++++++++++++++------------------
>  libavutil/frame.h   | 32 ++++++++++++++++++++++
>  libavutil/version.h |  2 +-
>  4 files changed, 78 insertions(+), 27 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 3c86f24285..e88cf7b4aa 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -14,6 +14,10 @@ libavutil:     2021-04-27
>  
>  API changes, most recent first:
>  
> +2022-05-26 - xxxxxxxxx - lavu 57.41.100 - frame.h
> +  Add av_frame_remove_all_side_data(), av_frame_copy_side_data(),
> +  AV_FRAME_TRANSFER_SD_COPY, and AV_FRAME_TRANSFER_SD_FILTER.
> +  
>  2022-10-30 - xxxxxxxxxx - lavu 57.40.100 - channel_layout.h
>    Add AV_CH_LAYOUT_CUBE and AV_CHANNEL_LAYOUT_CUBE.
>  
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index de4ad1f94d..8eb0e1ec95 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -276,9 +276,45 @@ FF_ENABLE_DEPRECATION_WARNINGS
>      return AVERROR(EINVAL);
>  }
>  
> +void av_frame_remove_all_side_data(AVFrame *frame)
> +{
> +    wipe_side_data(frame);
> +}
> +
> +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int flags)
> +{
> +    for (unsigned i = 0; i < src->nb_side_data; i++) {
> +        const AVFrameSideData *sd_src = src->side_data[i];
> +        AVFrameSideData *sd_dst;
> +        if ((flags & AV_FRAME_TRANSFER_SD_FILTER) &&
> +            sd_src->type == AV_FRAME_DATA_PANSCAN &&
> +            (src->width != dst->width || src->height != dst->height))
> +            continue;
> +        if (flags & AV_FRAME_TRANSFER_SD_COPY) {
> +            sd_dst = av_frame_new_side_data(dst, sd_src->type,
> +                                            sd_src->size);
> +            if (!sd_dst) {
> +                wipe_side_data(dst);
> +                return AVERROR(ENOMEM);
> +            }
> +            memcpy(sd_dst->data, sd_src->data, sd_src->size);
> +        } else {
> +            AVBufferRef *ref = av_buffer_ref(sd_src->buf);
> +            sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref);
> +            if (!sd_dst) {
> +                av_buffer_unref(&ref);
> +                wipe_side_data(dst);
> +                return AVERROR(ENOMEM);
> +            }
> +        }
> +        av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
> +    }
> +    return 0;
> +}
> +
>  static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy)
>  {
> -    int ret, i;
> +    int ret;
>  
>      dst->key_frame              = src->key_frame;
>      dst->pict_type              = src->pict_type;
> @@ -319,31 +355,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
>  
>      av_dict_copy(&dst->metadata, src->metadata, 0);
>  
> -    for (i = 0; i < src->nb_side_data; i++) {
> -        const AVFrameSideData *sd_src = src->side_data[i];
> -        AVFrameSideData *sd_dst;
> -        if (   sd_src->type == AV_FRAME_DATA_PANSCAN
> -            && (src->width != dst->width || src->height != dst->height))
> -            continue;
> -        if (force_copy) {
> -            sd_dst = av_frame_new_side_data(dst, sd_src->type,
> -                                            sd_src->size);
> -            if (!sd_dst) {
> -                wipe_side_data(dst);
> -                return AVERROR(ENOMEM);
> -            }
> -            memcpy(sd_dst->data, sd_src->data, sd_src->size);
> -        } else {
> -            AVBufferRef *ref = av_buffer_ref(sd_src->buf);
> -            sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref);
> -            if (!sd_dst) {
> -                av_buffer_unref(&ref);
> -                wipe_side_data(dst);
> -                return AVERROR(ENOMEM);
> -            }
> -        }
> -        av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
> -    }
> +    if ((ret = av_frame_copy_side_data(dst, src,
> +            (force_copy ? AV_FRAME_TRANSFER_SD_COPY : 0) |
> +            AV_FRAME_TRANSFER_SD_FILTER) < 0))
> +        return ret;
>  
>      ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref);
>      ret |= av_buffer_replace(&dst->private_ref, src->private_ref);
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index e60a82f6c0..5a3362fb55 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -861,6 +861,30 @@ int av_frame_copy(AVFrame *dst, const AVFrame *src);
>   */
>  int av_frame_copy_props(AVFrame *dst, const AVFrame *src);
>  
> +
> +/**
> + * Copy side data, rather than creating new references.
> + */
> +#define AV_FRAME_TRANSFER_SD_COPY      (1 << 0)
> +/**
> + * Filter out side data that does not match dst properties.
> + */
> +#define AV_FRAME_TRANSFER_SD_FILTER    (1 << 1)
> +
> +/**
> + * Copy all side-data from src to dst.
> + *
> + * @param dst a frame to which the side data should be copied.
> + * @param src a frame from which to copy the side data.
> + * @param flags a combination of AV_FRAME_TRANSFER_SD_*
> + *
> + * @return 0 on success, a negative AVERROR on error.
> + *
> + * @note This function will create new references to side data buffers in
> src,
> + * unless the AV_FRAME_TRANSFER_SD_COPY flag is passed.
> + */
> +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int flags);
> +
>  /**
>   * Get the buffer reference a given data plane is stored in.
>   *
> @@ -913,6 +937,14 @@ AVFrameSideData *av_frame_get_side_data(const AVFrame
> *frame,
>   */
>  void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType
> type);
>  
> +/**
> + * Remove and free all side data instances.
> + *
> + * @param frame from which to remove all side data.
> + */
> +void av_frame_remove_all_side_data(AVFrame *frame);
> +
> +
>  
>  /**
>   * Flags for frame cropping.
> diff --git a/libavutil/version.h b/libavutil/version.h
> index 2df788e529..b913f9d6c5 100644
> --- a/libavutil/version.h
> +++ b/libavutil/version.h
> @@ -79,7 +79,7 @@
>   */
>  
>  #define LIBAVUTIL_VERSION_MAJOR  57
> -#define LIBAVUTIL_VERSION_MINOR  40
> +#define LIBAVUTIL_VERSION_MINOR  41
>  #define LIBAVUTIL_VERSION_MICRO 100
>  
>  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \


>>> Patchset LGTM, I'll push this patchset if no more comment or objection. 
 
>> Can you wait a few days on this? I'd like to take a look at #1.

Hi Andreas,

Do you have any other thought about this patchset ? I'd like to merge this
patchset to fix qsv overlay.

BRs
Haihao




_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
1 participant