avutil: add ROI (Region Of Interest) data struct and bump version

The encoders such as libx264 support different QPs offset for different MBs,
it makes possible for ROI-based encoding. It makes sense to add support
within ffmpeg to generate/accept ROI infos and pass into encoders.

Typical usage: After AVFrame is decoded, a ffmpeg filter or user's code
generates ROI info for that frame, and the encoder finally does the
ROI-based encoding.

The ROI info is maintained as side data of AVFrame.

Signed-off-by: Guo, Yejun <yejun.guo@intel.com>
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
This commit is contained in:
Guo, Yejun 2019-01-10 16:53:30 +08:00 committed by Derek Buitenhuis
parent af05070ddf
commit 1ef4828276
4 changed files with 40 additions and 1 deletions

View File

@ -15,6 +15,9 @@ libavutil: 2017-10-21
API changes, most recent first: API changes, most recent first:
2019-01-08 - xxxxxxxxxx - lavu 56.26.100 - frame.h
Add AV_FRAME_DATA_REGIONS_OF_INTEREST
2018-12-21 - 2744d6b364 - lavu 56.25.100 - hdr_dynamic_metadata.h 2018-12-21 - 2744d6b364 - lavu 56.25.100 - hdr_dynamic_metadata.h
Add AV_FRAME_DATA_DYNAMIC_HDR_PLUS enum value, av_dynamic_hdr_plus_alloc(), Add AV_FRAME_DATA_DYNAMIC_HDR_PLUS enum value, av_dynamic_hdr_plus_alloc(),
av_dynamic_hdr_plus_create_side_data() functions, and related structs. av_dynamic_hdr_plus_create_side_data() functions, and related structs.

View File

@ -841,6 +841,7 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type)
case AV_FRAME_DATA_QP_TABLE_DATA: return "QP table data"; case AV_FRAME_DATA_QP_TABLE_DATA: return "QP table data";
#endif #endif
case AV_FRAME_DATA_DYNAMIC_HDR_PLUS: return "HDR Dynamic Metadata SMPTE2094-40 (HDR10+)"; case AV_FRAME_DATA_DYNAMIC_HDR_PLUS: return "HDR Dynamic Metadata SMPTE2094-40 (HDR10+)";
case AV_FRAME_DATA_REGIONS_OF_INTEREST: return "Regions Of Interest";
} }
return NULL; return NULL;
} }

View File

@ -173,6 +173,12 @@ enum AVFrameSideDataType {
* volume transform - application 4 of SMPTE 2094-40:2016 standard. * volume transform - application 4 of SMPTE 2094-40:2016 standard.
*/ */
AV_FRAME_DATA_DYNAMIC_HDR_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS,
/**
* Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of
* array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size.
*/
AV_FRAME_DATA_REGIONS_OF_INTEREST,
}; };
enum AVActiveFormatDescription { enum AVActiveFormatDescription {
@ -200,6 +206,35 @@ typedef struct AVFrameSideData {
AVBufferRef *buf; AVBufferRef *buf;
} AVFrameSideData; } AVFrameSideData;
/**
* Structure to hold Region Of Interest.
*
* self_size specifies the size of this data structure. This value
* should be set to sizeof(AVRegionOfInterest). EINVAL is returned if self_size is zero.
*
* Number of pixels to discard from the top/bottom/left/right border of
* the frame to obtain the region of interest of the frame.
* They are encoder dependent and will be extended internally
* if the codec requires an alignment.
* If the regions overlap, the last value in the list will be used.
*
* qoffset is quant offset, and base rule here:
* returns EINVAL if AVRational.den is zero.
* the value (num/den) range is [-1.0, 1.0], clamp to +-1.0 if out of range.
* 0 means no picture quality change,
* negtive offset asks for better quality (and the best with value -1.0),
* positive offset asks for worse quality (and the worst with value 1.0).
* How to explain/implement the different quilaity requirement is encoder dependent.
*/
typedef struct AVRegionOfInterest {
uint32_t self_size;
int top;
int bottom;
int left;
int right;
AVRational qoffset;
} AVRegionOfInterest;
/** /**
* This structure describes decoded (raw) audio or video data. * This structure describes decoded (raw) audio or video data.
* *

View File

@ -79,7 +79,7 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 56 #define LIBAVUTIL_VERSION_MAJOR 56
#define LIBAVUTIL_VERSION_MINOR 25 #define LIBAVUTIL_VERSION_MINOR 26
#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \