diff mbox series

[FFmpeg-devel,3/4] avutil: frame Update the existing QP API

Message ID 20200229122156.28115-4-michael@niedermayer.cc
State New
Headers show
Series [FFmpeg-devel,1/4] Remove all uses of AVFrame QP tables and related fields in AVFrame
Related show

Checks

Context Check Description
andriy/ffmpeg-patchwork pending
andriy/ffmpeg-patchwork success Applied patch
andriy/ffmpeg-patchwork success Configure finished
andriy/ffmpeg-patchwork success Make finished
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Michael Niedermayer Feb. 29, 2020, 12:21 p.m. UTC
This should extend the API to allow exporting internal tables for codecs
with block sizes different from 16x16 and different values per plane or
multiple values per block.

This is unfinished and only to demonstrate how such API (which maintains
API/ABI compatibility) would look
This API may allow some codecs to export their tables with 0 copy

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
 libavutil/frame.c | 21 ++++++++++++++++++++
 libavutil/frame.h | 49 +++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 64 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/libavutil/frame.c b/libavutil/frame.c
index 89089c6cc0..2cd680c886 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -100,6 +100,27 @@  int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type)
 
     return buf ? buf->data : NULL;
 }
+
+int av_get_qp_table_type_details(int type, int *block_size, int *independant_qps_per_block, int *dependant_qps_per_block,
+                                 int *independant_chroma_planes, int *dependant_chroma_planes, int *independant_alpha_planes, int *dependant_alpha_planes)
+{
+    *block_size = 16;
+    *independant_qps_per_block = 0;
+    *  dependant_qps_per_block = 0;
+    *independant_chroma_planes = 0;
+    *  dependant_chroma_planes = 0;
+    *independant_alpha_planes = 0;
+    *  dependant_alpha_planes = 0;
+    switch (type) {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+        return 0;
+    default:
+        return AVERROR(EINVAL);
+    }
+}
 #endif
 
 const char *av_get_colorspace_name(enum AVColorSpace val)
diff --git a/libavutil/frame.h b/libavutil/frame.h
index b966f37fe0..84ee94c7bb 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -715,12 +715,6 @@  attribute_deprecated
 int     av_frame_get_pkt_size(const AVFrame *frame);
 attribute_deprecated
 void    av_frame_set_pkt_size(AVFrame *frame, int val);
-#if FF_API_FRAME_QP
-attribute_deprecated
-int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type);
-attribute_deprecated
-int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type);
-#endif
 attribute_deprecated
 enum AVColorSpace av_frame_get_colorspace(const AVFrame *frame);
 attribute_deprecated
@@ -731,6 +725,49 @@  attribute_deprecated
 void    av_frame_set_color_range(AVFrame *frame, enum AVColorRange val);
 #endif
 
+/**
+ * Get Quantization parameter table.
+ * This returns a 2D array of values representing the QP of the specified AVFrame.
+ * the array is organized in planes then rows then columns then QP per block.
+ *
+ * @param stride    bytes per row in the returned array
+ * @returns a 2D array of QP values, the pixels per block depend on the type.
+ *          the array is valid as long as the frame is not destroyed or a new
+ *          qp table set.
+ * @see av_frame_set_qp_table()
+ */
+int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type);
+
+/**
+ * Set Quantization parameter table.
+ * This returns a 2D array of values representing the QP of the specified AVFrame.
+ *
+ * @param stride    bytes per row in the set array
+ * @returns a 2D array of QP values, the pixels per block depend on the type.
+ * @see av_frame_set_qp_table()
+ */
+int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type);
+
+/**
+ * Returns the details, each QP represents.
+ *
+ * @param block_size    spatial size of the square, each QP represents.
+ * @param independant_qps_per_block number of independant QP parameters per block (stored for each block)
+ * @param   dependant_qps_per_block number of dependant QP parameters per block (stored for each plane)
+ * @param independant_chroma_planes number of independant planes for chroma, this can be 0, 1 or 2
+ *                      with 0, the luma plane is used for chroma, with 1 there is
+ *                      one QP plane for both chroma components, or 2 for seperate QP
+ *                      per Chroma channel.
+ * @param   dependant_chroma_planes number of dependant planes for chroma, for each
+ *                      dependant chroma plane a single offset parameter if stored relative to
+ *                      the previous plane
+ * @param independant_alpha_planes  number of independant alpha planes of QP components
+ * @param   dependant_alpha_planes  number of dependant alpha planes of QP components
+ */
+int av_get_qp_table_type_details(int type, int *block_size, int *independant_qps_per_block, int *dependant_qps_per_block,
+                                 int *independant_chroma_planes, int *dependant_chroma_planes, int *independant_alpha_planes, int *dependant_alpha_planes);
+
+
 /**
  * Get the name of a colorspace.
  * @return a static string identifying the colorspace; can be NULL.