[FFmpeg-devel] [PATCH v2] lavu/frame: add QP side data

James Almer jamrial at gmail.com
Fri Mar 2 18:11:35 EET 2018


On 3/2/2018 8:16 AM, wm4 wrote:
> This adds a way for an API user to transfer QP data and metadata without
> having to keep the reference to AVFrame, and without having to
> explicitly care about QP APIs. It might also provide a way to finally
> remove the deprecated QP related fields. In the end, the QP table should
> be handled in a very similar way to e.g. AV_FRAME_DATA_MOTION_VECTORS.
> 
> There are two side data types, because I didn't care about having to
> repack the QP data so the table and the metadata are in a single
> AVBufferRef. Otherwise it would have either required a copy on decoding
> (extra slowdown for something as obscure as the QP data), or would have
> required making intrusive changes to the codecs which support export of
> this data.

Why not add an AVBufferRef pointer to the qp_properties struct instead?
You don't need to merge the properties fields into the buffer data.

> 
> The new side data types are added under deprecation guards, because I
> don't intend to change the status of the QP export as being deprecated
> (as it was before this patch too).
> ---
>  libavutil/frame.c                  | 59 ++++++++++++++++++++++++++++++++++----
>  libavutil/frame.h                  | 17 +++++++++++
>  tests/ref/fate/exif-image-embedded |  6 ++++
>  tests/ref/fate/exif-image-jpg      | 34 +++++++++++++---------
>  4 files changed, 96 insertions(+), 20 deletions(-)
> 
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 0db2a2d57b..ea13cd3ed6 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -46,8 +46,17 @@ MAKE_ACCESSORS(AVFrame, frame, enum AVColorRange, color_range)
>                 av_get_channel_layout_nb_channels((frame)->channel_layout))
>  
>  #if FF_API_FRAME_QP
> +struct qp_properties {
> +    int stride;
> +    int type;
> +};
> +
>  int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int qp_type)
>  {
> +    struct qp_properties *p;
> +    AVFrameSideData *sd;
> +    AVBufferRef *ref;
> +
>  FF_DISABLE_DEPRECATION_WARNINGS
>      av_buffer_unref(&f->qp_table_buf);
>  
> @@ -57,20 +66,56 @@ FF_DISABLE_DEPRECATION_WARNINGS
>      f->qscale_type  = qp_type;
>  FF_ENABLE_DEPRECATION_WARNINGS
>  
> +    av_frame_remove_side_data(f, AV_FRAME_DATA_QP_TABLE_PROPERTIES);
> +    av_frame_remove_side_data(f, AV_FRAME_DATA_QP_TABLE_DATA);
> +
> +    ref = av_buffer_ref(buf);
> +    if (!av_frame_new_side_data_from_buf(f, AV_FRAME_DATA_QP_TABLE_DATA, ref)) {
> +        av_buffer_unref(&ref);
> +        return AVERROR(ENOMEM);
> +    }
> +
> +    sd = av_frame_new_side_data(f, AV_FRAME_DATA_QP_TABLE_PROPERTIES,
> +                                sizeof(struct qp_properties));
> +    if (!sd)
> +        return AVERROR(ENOMEM);
> +
> +    p = (struct qp_properties *)sd->data;
> +    p->stride = stride;
> +    p->type = qp_type;
> +
>      return 0;
>  }
>  
>  int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type)
>  {
> -FF_DISABLE_DEPRECATION_WARNINGS
> -    *stride = f->qstride;
> -    *type   = f->qscale_type;
> +    AVBufferRef *buf = NULL;
>  
> -    if (!f->qp_table_buf)
> -        return NULL;
> +    *stride = 0;
> +    *type   = 0;
>  
> -    return f->qp_table_buf->data;
> +FF_DISABLE_DEPRECATION_WARNINGS
> +    if (f->qp_table_buf) {
> +        *stride = f->qstride;
> +        *type   = f->qscale_type;
> +        buf     = f->qp_table_buf;
>  FF_ENABLE_DEPRECATION_WARNINGS
> +    } else {
> +        AVFrameSideData *sd;
> +        struct qp_properties *p;
> +        sd = av_frame_get_side_data(f, AV_FRAME_DATA_QP_TABLE_PROPERTIES);
> +        if (!sd)
> +            return NULL;
> +        p = (struct qp_properties *)sd->data;
> +        sd = av_frame_get_side_data(f, AV_FRAME_DATA_QP_TABLE_DATA);
> +        if (!sd)
> +            return NULL;
> +        *stride = p->stride;
> +        *type   = p->type;
> +        buf     = sd->buf;
> +    }
> +
> +    return buf ? buf->data : NULL;
>  }
>  #endif
>  
> @@ -787,6 +832,8 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type)
>      case AV_FRAME_DATA_CONTENT_LIGHT_LEVEL:         return "Content light level metadata";
>      case AV_FRAME_DATA_GOP_TIMECODE:                return "GOP timecode";
>      case AV_FRAME_DATA_ICC_PROFILE:                 return "ICC profile";
> +    case AV_FRAME_DATA_QP_TABLE_PROPERTIES:         return "QP table properties";
> +    case AV_FRAME_DATA_QP_TABLE_DATA:               return "QP table data";
>      }
>      return NULL;
>  }
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index ddbac3156d..9d57d6ce66 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -141,6 +141,23 @@ enum AVFrameSideDataType {
>       * metadata key entry "name".
>       */
>      AV_FRAME_DATA_ICC_PROFILE,
> +
> +#if FF_API_FRAME_QP
> +    /**
> +     * Implementation-specific description of the format of AV_FRAME_QP_TABLE_DATA.
> +     * The contents of this side data are undocumented and internal; use
> +     * av_frame_set_qp_table() and av_frame_get_qp_table() to access this in a
> +     * meaningful way instead.
> +     */
> +    AV_FRAME_DATA_QP_TABLE_PROPERTIES,
> +
> +    /**
> +     * Raw QP table data. Its format is described by
> +     * AV_FRAME_DATA_QP_TABLE_PROPERTIES. Use av_frame_set_qp_table() and
> +     * av_frame_get_qp_table() to access this instead.
> +     */
> +    AV_FRAME_DATA_QP_TABLE_DATA,
> +#endif
>  };
>  
>  enum AVActiveFormatDescription {
> diff --git a/tests/ref/fate/exif-image-embedded b/tests/ref/fate/exif-image-embedded
> index 306ae0854b..0b640767a8 100644
> --- a/tests/ref/fate/exif-image-embedded
> +++ b/tests/ref/fate/exif-image-embedded
> @@ -29,6 +29,12 @@ color_transfer=unknown
>  chroma_location=center
>  TAG:UserComment=AppleMark
>  
> +[SIDE_DATA]
> +side_data_type=QP table data
> +[/SIDE_DATA]
> +[SIDE_DATA]
> +side_data_type=QP table properties
> +[/SIDE_DATA]
>  [/FRAME]
>  [FRAME]
>  media_type=audio
> diff --git a/tests/ref/fate/exif-image-jpg b/tests/ref/fate/exif-image-jpg
> index b266501191..dec2b78737 100644
> --- a/tests/ref/fate/exif-image-jpg
> +++ b/tests/ref/fate/exif-image-jpg
> @@ -27,30 +27,30 @@ color_space=bt470bg
>  color_primaries=unknown
>  color_transfer=unknown
>  chroma_location=center
> -TAG:ImageDescription=
> +TAG:ImageDescription=                               
>  TAG:Make=Canon
>  TAG:Model=Canon PowerShot SX200 IS
>  TAG:Orientation=    1
> -TAG:XResolution=    180:1
> -TAG:YResolution=    180:1
> +TAG:XResolution=    180:1      
> +TAG:YResolution=    180:1      
>  TAG:ResolutionUnit=    2
>  TAG:DateTime=2013:07:18 13:12:03
>  TAG:YCbCrPositioning=    2
> -TAG:ExposureTime=      1:1250
> -TAG:FNumber=     40:10
> +TAG:ExposureTime=      1:1250   
> +TAG:FNumber=     40:10     
>  TAG:ISOSpeedRatings=  160
>  TAG:ExifVersion= 48,  50,  50,  49
>  TAG:DateTimeOriginal=2013:07:18 13:12:03
>  TAG:DateTimeDigitized=2013:07:18 13:12:03
>  TAG:ComponentsConfiguration=  1,   2,   3,   0
> -TAG:CompressedBitsPerPixel=      3:1
> -TAG:ShutterSpeedValue=    329:32
> -TAG:ApertureValue=    128:32
> -TAG:ExposureBiasValue=      0:3
> -TAG:MaxApertureValue=    113:32
> +TAG:CompressedBitsPerPixel=      3:1      
> +TAG:ShutterSpeedValue=    329:32     
> +TAG:ApertureValue=    128:32     
> +TAG:ExposureBiasValue=      0:3      
> +TAG:MaxApertureValue=    113:32     
>  TAG:MeteringMode=    5
>  TAG:Flash=   16
> -TAG:FocalLength=   5000:1000
> +TAG:FocalLength=   5000:1000   
>  TAG:MakerNote=
>   25,   0,   1,   0,   3,   0,  48,   0,   0,   0,  28,   4,   0,   0,   2,   0
>    3,   0,   4,   0,   0,   0, 124,   4,   0,   0,   3,   0,   3,   0,   4,   0
> @@ -219,14 +219,20 @@ TAG:GPSLatitudeRef=R98
>  TAG:GPSLatitude= 48,  49,  48,  48
>  TAG:0x1001= 4000
>  TAG:0x1002= 2248
> -TAG:FocalPlaneXResolution=4000000:244
> -TAG:FocalPlaneYResolution=2248000:183
> +TAG:FocalPlaneXResolution=4000000:244    
> +TAG:FocalPlaneYResolution=2248000:183    
>  TAG:FocalPlaneResolutionUnit=    2
>  TAG:SensingMethod=    2
>  TAG:FileSource=  3
>  TAG:CustomRendered=    0
>  TAG:ExposureMode=    0
>  TAG:WhiteBalance=    0
> -TAG:DigitalZoomRatio=   4000:4000
> +TAG:DigitalZoomRatio=   4000:4000   
>  TAG:SceneCaptureType=    0
> +[SIDE_DATA]
> +side_data_type=QP table data
> +[/SIDE_DATA]
> +[SIDE_DATA]
> +side_data_type=QP table properties
> +[/SIDE_DATA]
>  [/FRAME]
> 



More information about the ffmpeg-devel mailing list