[FFmpeg-devel] [PATCH v2 02/18] cbs_h264: Add support for frame packing arrangement SEI messages
James Almer
jamrial at gmail.com
Tue Feb 23 18:39:42 EET 2021
On 2/21/2021 4:51 PM, Mark Thompson wrote:
> ---
> libavcodec/cbs_h264.h | 23 ++++++++++++++++
> libavcodec/cbs_h2645.c | 6 +++++
> libavcodec/cbs_h264_syntax_template.c | 39 +++++++++++++++++++++++++++
> 3 files changed, 68 insertions(+)
>
> diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h
> index 9eb97eae24..1466ed12fa 100644
> --- a/libavcodec/cbs_h264.h
> +++ b/libavcodec/cbs_h264.h
> @@ -282,6 +282,29 @@ typedef struct H264RawSEIRecoveryPoint {
> uint8_t changing_slice_group_idc;
> } H264RawSEIRecoveryPoint;
>
> +typedef struct H264RawSEIFramePackingArrangement {
> + uint32_t frame_packing_arrangement_id;
> + uint8_t frame_packing_arrangement_cancel_flag;
> +
> + uint8_t frame_packing_arrangement_type;
> + uint8_t quincunx_sampling_flag;
> + uint8_t content_interpretation_type;
> + uint8_t spatial_flipping_flag;
> + uint8_t frame0_flipped_flag;
> + uint8_t field_views_flag;
> + uint8_t current_frame_is_frame0_flag;
> + uint8_t frame0_self_contained_flag;
> + uint8_t frame1_self_contained_flag;
> + uint8_t frame0_grid_position_x;
> + uint8_t frame0_grid_position_y;
> + uint8_t frame1_grid_position_x;
> + uint8_t frame1_grid_position_y;
> + uint8_t frame_packing_arrangement_reserved_byte;
> + uint16_t frame_packing_arrangement_repetition_period;
> +
> + uint8_t frame_packing_arrangement_extension_flag;
> +} H264RawSEIFramePackingArrangement;
> +
> typedef struct H264RawSEIDisplayOrientation {
> uint8_t display_orientation_cancel_flag;
> uint8_t hor_flip;
> diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
> index 6005d46e0d..0c591871d4 100644
> --- a/libavcodec/cbs_h2645.c
> +++ b/libavcodec/cbs_h2645.c
> @@ -1570,6 +1570,12 @@ static const SEIMessageTypeDescriptor cbs_sei_h264_types[] = {
> sizeof(H264RawSEIRecoveryPoint),
> SEI_MESSAGE_RW(h264, sei_recovery_point),
> },
> + {
> + SEI_TYPE_FRAME_PACKING_ARRANGEMENT,
> + 1, 0,
> + sizeof(H264RawSEIFramePackingArrangement),
> + SEI_MESSAGE_RW(h264, sei_frame_packing_arrangement),
> + },
> {
> SEI_TYPE_DISPLAY_ORIENTATION,
> 1, 0,
> diff --git a/libavcodec/cbs_h264_syntax_template.c b/libavcodec/cbs_h264_syntax_template.c
> index 9587f33985..e03d41e47a 100644
> --- a/libavcodec/cbs_h264_syntax_template.c
> +++ b/libavcodec/cbs_h264_syntax_template.c
> @@ -719,6 +719,45 @@ static int FUNC(sei_recovery_point)(CodedBitstreamContext *ctx, RWContext *rw,
> return 0;
> }
>
> +
> +
> +static int FUNC(sei_frame_packing_arrangement)
> + (CodedBitstreamContext *ctx, RWContext *rw,
> + H264RawSEIFramePackingArrangement *current, SEIMessageState *sei)
> +{
> + int err;
> +
> + HEADER("Frame Packing Arrangement");
> +
> + ue(frame_packing_arrangement_id, 0, UINT32_MAX - 1);
> + flag(frame_packing_arrangement_cancel_flag);
> +
> + if (!current->frame_packing_arrangement_cancel_flag) {
> + u(7, frame_packing_arrangement_type, 0, 7);
> + flag(quincunx_sampling_flag);
> + u(6, content_interpretation_type, 0, 2);
> + flag(spatial_flipping_flag);
> + flag(frame0_flipped_flag);
> + flag(field_views_flag);
> + flag(current_frame_is_frame0_flag);
> + flag(frame0_self_contained_flag);
> + flag(frame1_self_contained_flag);
> + if (!current->quincunx_sampling_flag &&
> + current->frame_packing_arrangement_type != 5) {
nit: maybe H264_SEI_FPA_TYPE_INTERLEAVE_TEMPORAL instead of 5.
> + ub(4, frame0_grid_position_x);
> + ub(4, frame0_grid_position_y);
> + ub(4, frame1_grid_position_x);
> + ub(4, frame1_grid_position_y);
> + }
> + u(8, frame_packing_arrangement_reserved_byte, 0, 0);
> + ue(frame_packing_arrangement_repetition_period, 0, 16384);
> + }
> +
> + flag(frame_packing_arrangement_extension_flag);
> +
> + return 0;
> +}
> +
> static int FUNC(sei_display_orientation)(CodedBitstreamContext *ctx, RWContext *rw,
> H264RawSEIDisplayOrientation *current,
> SEIMessageState *sei)
>
LGTM.
More information about the ffmpeg-devel
mailing list