[FFmpeg-devel] [PATCH] libavutil/video_enc_params: add block type
Lynne
dev at lynne.ee
Wed Jul 8 02:12:46 EEST 2020
Jul 8, 2020, 00:08 by sw at jkqxz.net:
> On 07/07/2020 23:54, Lynne wrote:
>
>> Jul 7, 2020, 23:47 by yongle.lin.94 at gmail.com:
>>
>>> add block type field to AVVideoBlockParams so we could either export or visualize it later.
>>> ---
>>> libavutil/video_enc_params.h | 16 ++++++++++++++++
>>> 1 file changed, 16 insertions(+)
>>>
>>> diff --git a/libavutil/video_enc_params.h b/libavutil/video_enc_params.h
>>> index 43fa443154..52c0058f5b 100644
>>> --- a/libavutil/video_enc_params.h
>>> +++ b/libavutil/video_enc_params.h
>>> @@ -57,6 +57,11 @@ enum AVVideoEncParamsType {
>>> AV_VIDEO_ENC_PARAMS_H264,
>>> };
>>> +enum AVVideoBlockFlags {
>>> + AV_VIDEO_ENC_BLOCK_INTRA = 1ULL << 0, /* Indicates block uses intra prediction */
>>> + AV_VIDEO_ENC_BLOCK_SKIP = 1ULL << 1, /* Indicates block is not coded (skipped) */
>>> +};
>>> +
>>> /**
>>> * Video encoding parameters for a given frame. This struct is allocated along
>>> * with an optional array of per-block AVVideoBlockParams descriptors.
>>> @@ -126,6 +131,17 @@ typedef struct AVVideoBlockParams {
>>> * corresponding per-frame value.
>>> */
>>> int32_t delta_qp;
>>> +
>>> + /**
>>> + * Type flag of the block
>>> + * Each bit field indicates a type flag
>>> + */
>>> + enum AVVideoBlockFlags flags;
>>> +
>>> + /**
>>> + * Reference frames used for prediction
>>> + */
>>> + uint8_t ref[8];
>>> } AVVideoBlockParams;
>>>
>>
>> After some discussion on IRC, could you clarify the ref array description to this:
>>
>>> Each entry specifies the first/second/third/etc. reference frame the current frame uses.
>>> The value at each entry specifies the index inside the reference frame array for that current frame.
>>>
>>
>> E.g. your current frame has 6 valid possible references, and your frame header specifies you
>> can use ref_frame[3] and ref_frame[5] as a reference.
>> So the values of ref[] for each block must be either 3 or 5.
>> Its convoluted because the array maps indices to indices but it makes sense.
>>
>
> Please also define it precisely for H.264, the other supported codec.
>
> I came up with:
>
> """
> For H.264, the values in this array are indices into the default RefPicList0 as constructed by 8.2.4.2 (before ref pic list modification has run and without any truncation).
> If the block is intra-coded, no entries are valid.
> If the block in inter-coded with reference to a single picture, ref[0] containes the index of that picture (which might have come from L0 or L1 list).
> If the block is inter-coded using biprediction, ref[0] contains the index of the L0 picture and ref[1] contains the index of the L1 picture.
> """
>
> Not sure if that's doing exactly the right thing or matches what you intended, but this is tricky so it needs that level of detail.
>
> 8 distinct reference pictures also seems slightly ambitious for a single lowest-level block, but I guess the future is always about ever-more-complex coding tools...
>
> - Mark
>
Also specify that any entry that's unused will be set to -1. Zero is a valid index for non-keyframes after all.
More information about the ffmpeg-devel
mailing list