[FFmpeg-devel] [PATCH v2 02/18] cbs_h264: Add support for frame packing arrangement SEI messages
Mark Thompson
sw at jkqxz.net
Sun Feb 21 21:51:09 EET 2021
---
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) {
+ 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)
--
2.30.0
More information about the ffmpeg-devel
mailing list