aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2018-05-07 23:33:08 +0100
committerMark Thompson <sw@jkqxz.net>2018-05-10 23:54:01 +0100
commitd94dda742c8eab3141197270fb78063ed22442aa (patch)
tree7f42a384376ae69061a6bf0414b5ad8c69a95d80
parent9d375e114ac240ccff77d75724f6bc0e2210a1ba (diff)
downloadffmpeg-d94dda742c8eab3141197270fb78063ed22442aa.tar.gz
cbs_h264: Add support for pan-scan rectangle SEI messages
-rw-r--r--libavcodec/cbs_h264.h12
-rw-r--r--libavcodec/cbs_h2645.c1
-rw-r--r--libavcodec/cbs_h264_syntax_template.c28
-rw-r--r--libavcodec/h264_sei.h1
4 files changed, 42 insertions, 0 deletions
diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h
index d953c1f66b..bc1ce1256f 100644
--- a/libavcodec/cbs_h264.h
+++ b/libavcodec/cbs_h264.h
@@ -264,6 +264,17 @@ typedef struct H264RawSEIPicTiming {
H264RawSEIPicTimestamp timestamp[3];
} H264RawSEIPicTiming;
+typedef struct H264RawSEIPanScanRect {
+ uint32_t pan_scan_rect_id;
+ uint8_t pan_scan_rect_cancel_flag;
+ uint8_t pan_scan_cnt_minus1;
+ int32_t pan_scan_rect_left_offset[3];
+ int32_t pan_scan_rect_right_offset[3];
+ int32_t pan_scan_rect_top_offset[3];
+ int32_t pan_scan_rect_bottom_offset[3];
+ uint16_t pan_scan_rect_repetition_period;
+} H264RawSEIPanScanRect;
+
typedef struct H264RawSEIUserDataRegistered {
uint8_t itu_t_t35_country_code;
uint8_t itu_t_t35_country_code_extension_byte;
@@ -301,6 +312,7 @@ typedef struct H264RawSEIPayload {
union {
H264RawSEIBufferingPeriod buffering_period;
H264RawSEIPicTiming pic_timing;
+ H264RawSEIPanScanRect pan_scan_rect;
// H264RawSEIFiller filler -> no fields.
H264RawSEIUserDataRegistered user_data_registered;
H264RawSEIUserDataUnregistered user_data_unregistered;
diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
index 54f7e93755..76da801959 100644
--- a/libavcodec/cbs_h2645.c
+++ b/libavcodec/cbs_h2645.c
@@ -425,6 +425,7 @@ static void cbs_h264_free_sei_payload(H264RawSEIPayload *payload)
switch (payload->payload_type) {
case H264_SEI_TYPE_BUFFERING_PERIOD:
case H264_SEI_TYPE_PIC_TIMING:
+ case H264_SEI_TYPE_PAN_SCAN_RECT:
case H264_SEI_TYPE_RECOVERY_POINT:
case H264_SEI_TYPE_DISPLAY_ORIENTATION:
break;
diff --git a/libavcodec/cbs_h264_syntax_template.c b/libavcodec/cbs_h264_syntax_template.c
index b789207e33..fb1685e6e6 100644
--- a/libavcodec/cbs_h264_syntax_template.c
+++ b/libavcodec/cbs_h264_syntax_template.c
@@ -626,6 +626,30 @@ static int FUNC(sei_pic_timing)(CodedBitstreamContext *ctx, RWContext *rw,
return 0;
}
+static int FUNC(sei_pan_scan_rect)(CodedBitstreamContext *ctx, RWContext *rw,
+ H264RawSEIPanScanRect *current)
+{
+ int err, i;
+
+ ue(pan_scan_rect_id, 0, UINT32_MAX - 1);
+ flag(pan_scan_rect_cancel_flag);
+
+ if (!current->pan_scan_rect_cancel_flag) {
+ ue(pan_scan_cnt_minus1, 0, 2);
+
+ for (i = 0; i <= current->pan_scan_cnt_minus1; i++) {
+ ses(pan_scan_rect_left_offset[i], INT32_MIN + 1, INT32_MAX, 1, i);
+ ses(pan_scan_rect_right_offset[i], INT32_MIN + 1, INT32_MAX, 1, i);
+ ses(pan_scan_rect_top_offset[i], INT32_MIN + 1, INT32_MAX, 1, i);
+ ses(pan_scan_rect_bottom_offset[i], INT32_MIN + 1, INT32_MAX, 1, i);
+ }
+
+ ue(pan_scan_rect_repetition_period, 0, 16384);
+ }
+
+ return 0;
+}
+
static int FUNC(sei_user_data_registered)(CodedBitstreamContext *ctx, RWContext *rw,
H264RawSEIUserDataRegistered *current,
uint32_t *payload_size)
@@ -737,6 +761,10 @@ static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw,
CHECK(FUNC(sei_pic_timing)
(ctx, rw, &current->payload.pic_timing));
break;
+ case H264_SEI_TYPE_PAN_SCAN_RECT:
+ CHECK(FUNC(sei_pan_scan_rect)
+ (ctx, rw, &current->payload.pan_scan_rect));
+ break;
case H264_SEI_TYPE_FILLER_PAYLOAD:
{
for (i = 0; i < current->payload_size; i++)
diff --git a/libavcodec/h264_sei.h b/libavcodec/h264_sei.h
index 9488382b9f..6455f3cec5 100644
--- a/libavcodec/h264_sei.h
+++ b/libavcodec/h264_sei.h
@@ -27,6 +27,7 @@
typedef enum {
H264_SEI_TYPE_BUFFERING_PERIOD = 0, ///< buffering period (H.264, D.1.1)
H264_SEI_TYPE_PIC_TIMING = 1, ///< picture timing
+ H264_SEI_TYPE_PAN_SCAN_RECT = 2, ///< pan-scan rectangle
H264_SEI_TYPE_FILLER_PAYLOAD = 3, ///< filler data
H264_SEI_TYPE_USER_DATA_REGISTERED = 4, ///< registered user data as specified by Rec. ITU-T T.35
H264_SEI_TYPE_USER_DATA_UNREGISTERED = 5, ///< unregistered user data